Vérifier si une valeur existe déjà dans une liste Redis

Je me demande s'il existe un moyen de vérifier si une clé existe déjà dans une liste redis?

Je ne peux pas utiliser un ensemble parce que je ne veux pas imposer l'unicité, mais je veux être en mesure de vérifier si la chaîne est réellement là.

Merci.

35
demandé sur Reu 2012-02-16 18:16:52

3 réponses

Vos options sont les suivantes:

  1. en utilisant LREM et en le remplaçant s'il a été trouvé.
  2. maintenir un SET séparé en conjonction avec votre LIST
  3. en boucle à travers le LIST jusqu'à ce que vous trouviez l'élément ou atteigniez la fin.

Les listes Redis sont implémentées en tant que http://en.wikipedia.org/wiki/Linked_list , d'où les limites.

Je pense que votre meilleure option est de maintenir un doublon SET. C'est ce que j'ai tendance à faire. Il suffit de penser comme un indice supplémentaire. Quoi qu'il en soit, assurez-vous que vos actions sont atomiques avec MULTI-EXEC ou des scripts Lua.

55
répondu Fritzy 2012-02-17 08:03:44

Les listes

Autorisent les doublons mais ne fournissent pas un moyen simple de vérifier l'existence et comme @ Fritzy l'a conseillé, vous devez soit:

  • effectuer plusieurs opérations (supprimer puis Ajouter à nouveau est trouvé) pour des vérifications simples = coût dans le temps
  • maintenir un ensemble séparé = coût en mémoire

Je suis surpris que personne ne vous ait conseillé d'utiliser une table de hachage ou triés Set qui combinent les avantages de permettant duplicité (en stockant le nombre d'éléments en tant que valeur - table de hachage, ou score - ensemble trié) et membres d'indexation par nature d'une table de hachage/ensemble.


Table De Hachage

Pour vérifier l'existence d'une clé, utilisez la commande HGET. Il renvoie une réponse nil si le membre spécifié n'existe pas.

Pour ajouter un nouveau membre, utilisez simplement HINCRBY qui mettra à jour la valeur (c'est-à-dire le nombre d'éléments avec le nom du membre) ou créera un nouveau membre si elle n'existe pas.


Ensemble Trié

Pour vérifier l'existence d'une clé, utilisez l'une des trois commandes suivantes:

  • ZSCORE
  • ZRANK
  • ZREVRANK

Ils renvoient une réponse nil si le membre spécifié n'existe pas.

Pour ajouter un nouveau membre, utilisez simplement ZINCRBY qui mettra à jour le score (c'est-à-dire le nombre d'éléments avec le nom du membre) ou créera un nouveau membre s'il n'existe pas.


Pour résumer jusqu': Ensembles classés ou Tables de Hachage vous permettre de faire toutes les opérations avec vos exigences , avec une seule commande.

21
répondu Bernard Rosset 2017-07-02 04:56:13

Non, il n'y a aucun moyen de vérifier si une liste redis contient une valeur donnée. Voir commandes de liste Redis pour référence.

Je suppose que vous pouvez utiliser LREM pour (essayer de) supprimer la valeur, et vérifier la valeur de retour pour voir si elle a été supprimée. Mais alors vous devriez le remettre en place, et cela semble douteux. Il y a probablement une meilleure solution à votre problème - qu'essayez-vous de réaliser?

5
répondu Linus Gustav Larsson Thiel 2012-02-16 15:08:03