为什么Redis中没有有序的哈希表?

3

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

肯定会有一些用例需要按照键的特定顺序存储键值对。但当前的有序集合只能根据分数存储键。

1个回答

4
必须有一些用例需要按键的特定顺序存储键值对。由于Redis键是二进制字符串,我假设您提到的特定顺序是字典序(具体而言,使用“ memcmp”函数比较键)。在这种情况下,您可以使用SORTED SET实现C++的std :: map。您可以通过两个步骤实现此目标:
构建一个使用Redis的Sorted Set的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 版本开始,它支持一些命令来操作词法范围(lexicographical ranges),因此您可以构建与 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

1
感谢提供信息。我认为在Redis中,zadd a value_a中的a是键,value_a是值。但实际上,a是有序集合的名称,而value_a是其元素。如果它像std::map一样,语法应该是zadd std::map key value - Kaidul
Redis中没有这样的数据结构,因此您需要按照我在答案中提到的两个步骤来实现它。如果您将这些步骤包装在lua脚本中,则可以获得一个内置的std :: mapredis-cli --eval map.lua std::map,key value - for_stack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接