redis performance, stocker l'objet json comme une chaîne

j'ai besoin de sauver un modèle D'Utilisateur, quelque chose comme:

{ "nickname": "alan",
  "email": ...,
  "password":...,
  ...} // and a couple of other fields

Aujourd'hui, j'utilise un ensemble: users

Dans cet ensemble, j'ai un membre comme l'utilisateur:alan

Dans ce membre j'ai le hash ci-dessus

cela fonctionne très bien, mais je me demandais si au lieu de l'approche ci-dessus qui pourrait avoir du sens d'utiliser la suivante:

Utilisez toujours le jeu users (pour obtenir facilement les utilisateurs (membres) liste)

Dans cet ensemble n'utilisez qu'un stockage clé / valeur comme:

clé: alan valeur : la version stringify du hash utilisateur ci-dessus

récupérer un enregistrement serait alors plus facile (je devrais alors le Parser avec JSON).

je suis très nouveau à redis et je ne suis pas sûr de ce qui pourrait être le meilleur. Qu'en pensez-vous ?

22
demandé sur Luc 2011-04-20 16:02:36

4 réponses

vous pouvez utiliser Redis hashes structure de données pour stocker vos champs et valeurs d'objet JSON. Par exemple, votre ensemble "users" peut encore être utilisé comme une liste qui stocke tous les utilisateurs et votre objet JSON individuel peut être stocké dans du hash comme ceci:

db.hmset("user:id", JSON.stringify(jsonObj));

Maintenant, vous pouvez obtenir par clé Tous les utilisateurs ou seulement un spécifique (à partir de laquelle vous obtenez/définissez seulement les champs/valeurs spécifiés). Aussi ces deux les questions sont probablement liées à votre scénario.

EDIT: (désolé, je ne savais pas que nous en avons parlé plus tôt)

récupérer un enregistrement serait alors plus facile (je devrais alors le Parser avec JSON).

c'est vrai, mais avec la structure de données de hachage vous pouvez obtenir/définir seulement le champ/la valeur avec laquelle vous devez travailler. Récupérer tout l'objet JSON peut entraîner diminution de la performance (dépend de la fréquence à laquelle vous le faites) si vous voulez seulement changer une partie de l'objet (l'autre chose est que vous aurez besoin de stringify/parse l'objet à chaque fois).

20
répondu yojimbo87 2017-05-23 10:29:08

un avantage supplémentaire pour JSON par rapport aux hachures est le maintien du type. 123.3 devient la chaîne "123.3" et selon la bibliothèque Null / None peut accidentellement être moulé en "null" .

les deux sont un peu fastidieux car cela nécessitera l'écriture d'un transformateur pour extraire les chaînes et les convertir de nouveau à leurs types attendus.

pour des considérations de consommation d'espace/mémoire, j'ai commencé à me pencher vers en stockant juste les valeurs comme une liste JSON ["my_type_version", 123.5, null , ... ] de sorte que je n'ai pas eu la tête de N * ( sum(len(concat(JSON key names))) qui dans mon cas était +60% de l'empreinte mémoire utilisée de Redis.

7
répondu David 2013-09-09 19:19:24

gardez à l'esprit: les hachures ne peuvent pas stocker les objets imbriqués, JSON peut le faire.

4
répondu mzalazar 2014-04-19 11:52:52

Franchement, fonctionne très bien. La façon dont vous le stocker est une décision de conception que vous devrez prendre. Cela dépend de la façon dont vous voulez récupérer les informations utilisateur, etc.

en termes de performance, le stockage de la version encodée JSON de l'objet utilisateur utilisera moins de mémoire et prendra moins de temps pour le stockage/la récupération. C'est-à-dire, JSON parsing est probablement plus rapide que de récupérer chaque champ de Redis. Et, même si non, il est probablement plus efficace de mémoire. Le différence de performance est probablement minime de toute façon.

2
répondu BMiner 2011-04-20 20:10:29