2

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

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

4

1 回答 1

4

必须有一些用例,我们必须根据键以特定顺序存储键值对

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

使用 Redis 的 Sorted Set 构建 std::set

如果 a 中的 2 个元素SORTED SET具有相同的分数,则它们按字典顺序排序。因此,为了构建 a std::set,只需给 a 中的所有成员以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 开始,它支持一些命令来对字典范围进行操作,这样你就可以构建类似的东西 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 +

将集合中的每个键映射到一个值

既然你已经得到了 a std::set,那么将键映射到一个值,你就可以得到 a 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
于 2016-10-16T13:31:11.963 回答