2016-10-16 1 views
2

Redis Data types inclut sorted set et d'autres structures de données nécessaires pour le stockage de valeurs-clés. Mais je me demande pourquoi il n'a aucune carte triée comme de Java ou std::map de C++. Je pense que la structure de données sous-jacente serait la plupart du temps similaire à l'ensemble trié car les deux sont supposés être un arbre de recherche binaire équilibré.Pourquoi il n'y a pas de hashmap ordonné dans Redis?

Il doit y avoir des cas d'utilisation où nous devons stocker une paire clé-valeur dans un ordre spécifique en fonction de la clé. Mais l'ensemble trié actuel sert uniquement à mémoriser la clé en fonction du score.

Répondre

3

Il doit y avoir des cas d'utilisation où nous devons stocker paire clé-valeur pour spécifique en fonction de clé

Comme les clés Redis sont des chaînes binaires, je suppose que l'ordre spécifique vous avez mentionné, est l'ordre lexicographique (en particulier, les clés sont comparées avec la fonction memcmp). Dans ce cas, vous pouvez facilement implémenter un C++ std::map avec SORTED SET. Vous pouvez y parvenir avec 2 étapes:

Construire un std :: set avec de Redis Classé Set

Si 2 éléments dans un SORTED SET ont le même score, ils sont classés par ordre lexicographique. Ainsi, afin de construire un std::set, juste donner tous les membres d'un SORTED SET avec le même score:

zadd std::set 0 c 
zadd std::set 0 a 
zadd std::set 0 b 

// since all these members have the same score, 
// the result is lexicographical ordered: 
// a b c 
zrange std::set 0 -1 

// the following command will fail, since 'c' already exists. 
zadd std::set 0 c 

Depuis Redis 2.8, it supports some commands pour fonctionner sur les plages lexicographiques, de sorte que vous pouvez construire quelque chose de similaire à std::set::lower_bound, ou std::set::upper_bound

// something similar to lower_bound: find all members not less than b 
zrangebylex std::set [b + 
// something similar to upper_bound: find all members greater than b 
zrangebylex std::set (b + 

Carte chaque touche dans le jeu avec une valeur

Étant donné que vous obtenez déjà un std::set, puis mappez la clé avec une valeur, vous pouvez obtenir un std::map.

set a value_a 
set b value_b 
set c value_c 

Combiner ces 2 étapes ensemble

Vous pouvez envelopper tout le travail dans un script lua d'avoir un intégréstd::map. Et utilisez-le comme ceci:

redis-cli --eval map.lua map_name , key value 
+0

Merci pour l'information. Je pense que pour 'zadd a value_a', ici' a' est la clé et 'value_a' est la valeur dans les perspectives redis. Mais en réalité 'a' est le nom de l'ensemble trié et' value_a' est son élément. Si ce serait comme 'std :: map', la syntaxe serait' zadd std :: map key value'. –

+0

Il n'existe pas de structure de données de ce type dans Redis, vous avez donc besoin de 2 étapes pour en implémenter une, comme je l'ai mentionné dans la réponse. Si vous encapsulez ces étapes dans un script lua, vous pouvez obtenir un * built-in * 'std :: map':' redis-cli -eval map.lua std :: map, valeur-clé'. –