270 votes

Conventions de nommage des clés Redis ?

Quelle est la convention de nommage standard pour les clés dans Redis ? J'ai vu des valeurs séparées par : mais je ne sais pas quelle est la convention standard.

Pour un utilisateur, vous feriez quelque chose comme : user:00

Si l'identifiant de l'utilisateur est 00

Êtes-vous en mesure d'interroger uniquement le début de la clé pour obtenir tous les utilisateurs ?

J'espère surtout éviter tout problème à l'avenir en me renseignant sur la manière dont les gens fonctionnent et sur les raisons pour lesquelles ils les ont choisies.

263voto

yojimbo87 Points 27744

Quelle est la convention de nommage normale pour les clés dans Redis ? J'ai vu séparées par des : mais je ne suis pas sûr de la convention normale, ou pourquoi.

Oui, signe du colon : est une convention pour nommer les clés. Dans les cette Le tutoriel sur le site web de redis est indiqué : Essayez de vous en tenir à un schéma. Par exemple, "object-type:id:field" peut être une bonne idée, comme dans "user:1000:password". J'aime utiliser des points pour les pour les champs à plusieurs mots, comme dans "comment:1234:reply.to".

Êtes-vous en mesure d'interroger uniquement le début de la clé pour obtenir tous les éléments suivants ? utilisateurs ?

Si vous voulez dire quelque chose comme une requête directe pour toutes les clés qui commencent par user: il existe un clés pour cela. Cette commande ne doit cependant être utilisée qu'à des fins de débogage car elle est O(N) car il recherche toutes les clés stockées dans la base de données.

La solution la plus appropriée à ce problème est de créer une clé dédiée, que nous appellerons users qui stockera toutes les clés des utilisateurs, par exemple dans liste o fixer structure des données.

0 votes

Il ne s'agit pas d'une convention, mais il est similaire au format URI, ce qui le rend commun partout ailleurs.

0 votes

@Gustav en regardant la page wiki URI-format, je n'arrive pas à comprendre en quoi ce standard de facto de redis est similaire à l'URI-format. Pouvez-vous m'expliquer ?

0 votes

Je parle de urn:example:animal:ferret:nose sur cette page wiki.

43voto

The Nail Points 3567

Nous utilisons deux points ( :) comme séparateur d'espace de noms et un dièse (#) pour les éléments d'identification des clés, par exemple :

logistics:building#23

0 votes

Quelle est la meilleure convention de nom si vous avez plus de clés comme locale, category etc ? {resource}:{key}#{value},{key}#{value} => texts:locale#fr,category#15 ? Ou avez-vous d'autres suggestions ?

2 votes

Dans mon exemple, "building" est simplement le nom de la "collection", et 23 est l'"id" personnalisé. Si vous avez un identifiant composite avec locale=fr et category=15, l'identifiant réel pourrait être {fr,15}, donc namespace:texts#{fr,15} ou, pour être plus verbeux, namespace:texts#{locale=fr,category=15}. Mais ce n'est qu'une idée, je ne l'ai jamais utilisée ainsi. Attention à ne pas changer l'ordre des éléments id, car la clé ne sera pas trouvée bien sûr. En fait, au lieu d'encoder une telle complexité dans vos noms de clés, envisagez plutôt d'utiliser les structures de données redis. Jetez un coup d'œil à redis.io/topics/indexes

23voto

Akseli Palén Points 7697

Une convention semble être les deux points ( :) mais Je suis développeur web et je préfère donc la barre oblique (/) comme séparateur. La barre oblique est déjà un séparateur très important dans les URL qui sont censées être Localisateurs de ressources uniformes donc des clés pour les ressources. Pourquoi adopter une approche différente avec les deux points ( :)? Est-ce que cela peut aider ?

Prenons l'exemple suivant :

Nous avons un RESTful API pour les objets jouets. Il en existe une :

http://example.com/api/toy/234 

Où l'avons-nous stocké ? Nous utilisons Redis et des barres obliques, la clé est donc évidente :

toy/234

Il s'agit de la clé unique du jouet. La clé peut maintenant être utilisée du côté du client :

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

Un utilisateur demande un objet avec la clé toy/666 . Comment l'obtenir à partir de Redis ? Un exemple lié à Node.js :

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

Il n'est pas nécessaire de convertir les barres obliques en deux points et vice versa. Pratique, vous ne trouvez pas ?

Attention : veillez toujours à ce que l'utilisateur ne puisse accéder qu'aux éléments que vous avez prévus. L'approche URL-to-key brute décrite ci-dessus permet d'obtenir les informations suivantes user/1/password également, comme l'ont noté les commentateurs. Cela ne devrait pas poser de problème si vous utilisez Redis comme cache public en lecture seule.

32 votes

Pratique, et presque dégoûtant peu sûrs d'eux. Vous suppliez pour obtenir curl http://example.com/api/user/1/password d, ou similaire. (Je dis ça comme ça.)

6 votes

Les deux points, les haches et les barres obliques peuvent être utilisés pour désigner différents niveaux d'imbrication, par exemple User#23:uploads:my/path/to/file.ext

43 votes

Ne prenez jamais les données de l'utilisateur comme clé d'accès à la base de données.

6voto

Jim Dennis Points 5454

Je ne sais pas s'il y a vraiment des "meilleures pratiques" répandues pour le nommage des clés Redis.

J'ai expérimenté l'utilisation des caractères ASCII NUL comme séparateurs (puisque Redis et Python sont tous deux propres à 8 bits). C'est un peu laid si vous regardez les clés brutes, mais l'idée est de les cacher derrière une couche d'abstraction. Les deux points et les symboles de tuyauterie sont des alternatives évidentes tant que les composants de votre espace de noms sont garantis de ne pas les utiliser ou que vous êtes prêt à encoder chaque composant comme il se doit. Cependant, si vous les encodez, vous voudrez développer la couche d'abstraction et éviter de voir les clés brutes de toute façon ... ce qui m'a ramené à l'utilisation de \0 dans mon raisonnement.

Il sera intéressant de voir si d'autres opinions sont exprimées à ce sujet.

3voto

vitro Points 375

Pour votre cas d'utilisation, il me semble que HSET / HGET serait mieux adapté. Il y a aussi HKEYS mando.

Toutes ces commandes ont la même complexité que GET/SET/KEYS, alors pourquoi ne pas les utiliser ?

Vous pourriez alors disposer de cette structure :

  • utilisateurs > 00 > valeur
  • utilisateurs > 01 > valeur

ou :

  • utilisateurs:nom d'utilisateur > 00 > valeur
  • utilisateurs:nom d'utilisateur > 01 > valeur

Il suffit d'extraire l'identifiant de l'utilisateur et de l'utiliser comme clé de hachage. Personnellement, je préfère cette approche car elle est plus agréable et vous pouvez facilement rechercher des identifiants d'utilisateurs existants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X