【问题标题】:Why there is no ordered hashmap in Redis?为什么 Redis 中没有有序的 hashmap?
【发布时间】:2016-10-16 12:20:10
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    使用 Redis 的 Sorted Set 构建 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
    

    【讨论】:

    • 感谢您的信息。我认为对于zadd a value_a,这里a 是关键,value_a 是redis 视角中的价值。但实际上a 是有序集的名称,value_a 是它的元素。如果它类似于std::map,则语法为zadd std::map key value
    • Redis中没有这样的数据结构,所以你需要2个步骤来实现一个,正如我在答案中提到的。如果将这些步骤包装在 lua 脚本中,您可以获得 内置 std::map: redis-cli --eval map.lua std::map , key value
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2010-12-24
    • 2020-09-24
    相关资源
    最近更新 更多