web-dev-qa-db-fra.com

Conventions de dénomination des clés Redis?

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

Pour un utilisateur, feriez-vous quelque chose comme ...

user:00

si l'identifiant de l'utilisateur était 00

Pouvez-vous interroger le début de la clé pour renvoyer tous les utilisateurs?

J'espère simplement éviter tout problème futur en cherchant des façons de travailler pour les gens et pourquoi ils les ont choisis.

200
fancy

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

Oui, signe du côlon : est une convention pour nommer les clés. Dans this , le didacticiel sur le site Web Redis indique: Essayez de vous en tenir à un schéma. Par exemple, "type d'objet: id: champ" peut être une bonne idée, comme dans "utilisateur: 1000: mot de passe". J'aime utiliser des points pour les champs de plusieurs mots, comme dans "commentaire: 1234: réponse.to".

Pouvez-vous interroger le début de la clé pour renvoyer tous les utilisateurs?

Si vous voulez dire quelque chose comme interroger directement toutes les clés qui commence par user: _ il existe une commande keys pour cela. Cette commande ne devrait cependant être utilisée qu'à des fins de débogage car elle est O (N) car elle recherche toutes les clés analysées dans la base de données.

Une solution plus appropriée à ce problème est de créer une clé dédiée, nommons users, qui stockera toutes les clés des utilisateurs, par exemple, dans liste ou set = structure de données.

173
yojimbo87

Nous utilisons deux points (:) comme séparateur d’espace de nom et un dièse (#) pour les parties id de clés, par exemple:

logistics:building#23
25
The Nail

Une convention semble être deux points (:) mais Je suis un développeur Web, donc je préfère personnellement une barre oblique (/) pour le séparateur. La barre oblique est déjà un séparateur si important dans les URL qui sont censées être localisateurs de ressources uniformes donc types de clés pour les ressources. Pourquoi adopter une approche différente avec deux points (:)? Est-ce que ça aide quelque chose?

Considérons cet exemple:

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

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

C'est la clé unique pour le jouet. La clé peut maintenant être utilisée aussi du côté 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 de Redis? Un exemple lié à Node.js:

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

Pas besoin de convertir les barres obliques en deux points et vice versa. Pratique, vous ne pensez pas?

Remarque: assurez-vous toujours que l'utilisateur ne peut accéder qu'aux éléments souhaités. L'approche brute URL à clé ci-dessus permet d'extraire user/1/password aussi, comme l'ont noté des commentateurs. Cela ne devrait pas poser de problème si vous utilisez Redis en tant que cache public en lecture seule.

15
Akseli Palén

Je ne sais pas s'il existe encore des "meilleures pratiques" pour la dénomination des clés de Redis.

J'ai expérimenté avec ASCII les caractères NUL comme séparateurs (depuis Redis et Python sont tous les deux propres 8 bits)). Cela semble un peu moche si vous Nous cherchons des clés brutes, mais l’idée est de les cacher derrière une couche d’abstraction. Les symboles de deux points et de tuyau sont des alternatives évidentes tant que les composants de votre espace de noms sont garantis ne pas les utiliser ou que vous êtes prêt à les coder. Cependant, si vous voulez les encoder, vous voudrez développer la couche d’abstraction et éviter de voir les clés brutes de toute façon ... ce qui m’a amené à revenir à l’utilisation de\0 dans mon raisonnement.

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

5
Jim Dennis

Pour votre cas d'utilisation, il me semble que HSET / HGET serait un meilleur ajustement. Il y a aussi une commande HKEYS .

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

Vous pourriez avoir cette structure alors:

  • 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 interroger des identifiants d’utilisateur existants.

0
vitro