为什么Redis中没有有序hashmap?

为什么Redis中没有有序hashmap?,redis,in-memory-database,key-value-store,ordered-map,Redis,In Memory Database,Key Value Store,Ordered Map,包括键值存储所需的数据结构和其他必要的数据结构。但我想知道为什么它没有像Java的TreeMap或C++的std::map那样的排序映射。我认为底层数据结构与排序集基本相似,因为两者都应该是平衡的二叉搜索树 在某些用例中,我们必须根据键以特定的顺序存储键值对。但当前排序集仅用于根据分数存储密钥 在某些用例中,我们必须根据密钥以特定的顺序存储键值对 由于Redis键是二进制字符串,我假设您提到的特定顺序是字典顺序(具体来说,键与memcmp函数进行比较)。在这种情况下,您可以使用排序集轻松实现C+

包括键值存储所需的数据结构和其他必要的数据结构。但我想知道为什么它没有像Java的
TreeMap
或C++的
std::map
那样的排序映射。我认为底层数据结构与排序集基本相似,因为两者都应该是平衡的二叉搜索树

在某些用例中,我们必须根据键以特定的顺序存储键值对。但当前排序集仅用于根据分数存储密钥

在某些用例中,我们必须根据密钥以特定的顺序存储键值对

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

使用Redis的排序集构建std::set

如果
排序集中的两个元素具有相同的分数,则它们按字典顺序排列。因此,为了构建一个
std::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开始,您就可以在词典范围上进行操作,从而可以构建类似于
std::set::lower_bound
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 +
使用值映射集合中的每个键

因为您已经获得了一个
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

谢谢你提供的信息。我认为对于
zadda value\u a
,这里
a
是关键,
value\u a
是redis透视图中的值。但实际上,
a
是排序集的名称,
value\u a
是它的元素。如果它类似于
std::map
,那么语法将是
zadd std::map key value
。Redis中没有这样的数据结构,因此需要两个步骤来实现一个,正如我在回答中提到的。如果将这些步骤包装在lua脚本中,则可以获得内置的
std::map
redis cli--eval map.lua std::map,键值