web-dev-qa-db-fra.com

Des espaces de noms à Redis?

Est-il possible de créer des espaces de noms dans Redis?

D'après ce que j'ai trouvé, toutes les commandes globales (compter, supprimer tout) fonctionnent sur tous les objets. Existe-t-il un moyen de créer des sous-espaces de sorte que ces commandes soient limitées dans leur contexte?

Je ne veux pas configurer différents serveurs Redis à cet effet.

Je suppose que la réponse est "Non", et je me demande pourquoi cela n'a pas été mis en œuvre, car il semble être une fonctionnalité utile sans trop de frais généraux.

45
ripper234

Un serveur Redis peut gérer plusieurs bases de données ... qui sont numérotées. Je pense qu'il en fournit 32 par défaut; vous pouvez y accéder en utilisant l'option - n de la commande de script Shell redis-cli et par des options similaires aux arguments de connexion ou en utilisant la fonction "select()" méthode sur ses objets de connexion. (Dans ce cas .select() est le nom de la méthode pour le module Python Redis ... Je suppose qu'il porte le même nom pour les autres bibliothèques et interfaces).

Il existe une option pour contrôler le nombre de bases de données distinctes que vous souhaitez également dans le fichier de configuration du démon du serveur Redis. Je ne sais pas quelle serait la limite supérieure et il ne semble pas y avoir de moyen de changer cela dynamiquement (en d'autres termes, il semble que vous deviez arrêter et redémarrer le serveur pour ajouter des bases de données supplémentaires). De plus, il ne semble pas possible de les associer à une sorte de nom ni de leur imposer des ACLS distincts, ni même des mots de passe différents. Redis, bien sûr, est également sans schéma.

33
Jim Dennis

Si vous utilisez Ruby vous pouvez regarder ces joyaux:
https://github.com/resque/redis-namespace
https://github.com/jodosha/redis-store

1
Sergii Mostovyi

Si vous utilisez Node, ioredis a préfixation de clé transparente , ce qui fonctionne en faisant ajouter au client une chaîne donnée à chaque clé d'une commande. Cela fonctionne de la même manière que Ruby redis-namespace . Cette approche côté client place toujours toutes vos clés dans la même base de données, mais au moins vous ajoutez une certaine structure et vous n'avez pas à utiliser plusieurs bases de données ou serveurs.

var fooRedis = new Redis({ keyPrefix: 'foo:' });
fooRedis.set('bar', 'baz');  // Actually sends SET foo:bar baz
1
Danny Guo