为什么Redis中没有有序的hashmap?

时间:2016-10-16 12:20:10

标签: redis in-memory-database key-value-store ordered-map

Redis Data types包括sorted set以及其他必要的键值存储数据结构。但我想知道为什么它没有任何有序的地图,如Java TreeMap或C ++' std::map。我认为底层数据结构与排序集大致相似,因为两者都应该是平衡二叉搜索树。

必须有一些用例,我们必须根据密钥按特定顺序存储键值对。但是当前的排序集仅用于根据分数存储密钥的目的。

1 个答案:

答案 0 :(得分:3)

  

必须有一些用例,我们必须根据密钥

按特定顺序存储键值对

由于Redis键是二进制字符串,我假设您提到的特定顺序是字典顺序(具体而言,键与memcmp函数进行比较)。在这种情况下,您可以使用std::map轻松实现C ++ SORTED SET。您可以通过两个步骤实现此目的:

  

用Redis构建一个std :: set'排序集

如果SORTED SET中的2个元素具有相同的分数,则按字典顺序排序。因此,为了构建std::set,只需为SORTED SET中的所有成员提供相同的分数:

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

由于Redis 2.8,it supports some commands可以在字典范围内操作,因此您可以构建类似于std::set::lower_boundstd::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 +
  

使用值

映射集合中的每个键

由于您已获得std::set,因此使用值映射该键,您可以获得std::map

set a value_a
set b value_b
set c value_c
  

将这两个步骤合并在一起

您可以将整个工作包装到lua脚本中,以获得内置 std::map。并像这样使用它:

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