【问题标题】:Redis store lists of values inside Redis hashRedis 在 Redis 哈希中存储值列表
【发布时间】:2018-04-10 18:43:03
【问题描述】:

我的任务是获取特定 user_id 的动物列表(例如)。

我不想为每个用户使用 set/list。

我尝试使用散列,其中每个字段都是 user_id,每个值都是串联的动物字符串。例如:{"1234" : "dog cat", "8477" : "bird dog"}。在这里,我可以为用户“1234”获取动物,只需调用 Redis。

我知道有一个APPEND 命令,它将项目附加到一个字符串。但这不适用于附加到散列中的值。

我也尝试过使用 set,并通过前缀获取值。对于上面的示例,我的集合将包含:("1234:dog", "1234:cat", "8477:bird", "8477:dog")。为了获取用户“1234”的所有动物,我需要搜索前缀“1234:”。但是当我有太多物品时,这不是规模。

我可以做些什么来完成我的任务?

【问题讨论】:

    标签: redis


    【解决方案1】:

    如果您不想为每个用户保留单独的 Set/List,但希望以最佳方式为每个用户获取数据,Redis SortedSet 数据结构和字典搜索似乎是您的解决方案。

    将数据保存在 SortedSet(命名为 animals)中:

    ZADD animals 0 1234:dog 0 1234:cat 0 8477:bird 0 8477:dog
    

    从该 SortedSet 中获取用户 1234 的数据:

    ZRANGEBYLEX animals [1234: (1234;
    

    输出:

    1) "1234:cat"
    2) "1234:dog"
    

    【讨论】:

    • @sazzad 我找不到一个排序集可以容纳的最大键数。你知道吗?
    • @EyalCh 你知道 Set/List/Hash 一样吗?
    【解决方案2】:

    Redis 的数据结构不能嵌套在其他数据结构中,因此无法将 List 存储在 Hash 中。

    在 redis 中,您可以随意创建任意数量的键。所以你可以做的是让键附加user_id<hash_key>。为该键维护一个 hashSet/list。例如:

    user_id:1234 =["dog", "cat"];
    user_id:8477 =["bird", "dog"];
    

    查看以下链接了解更多详情:

    1. redis-storing-list-inside-hash
    2. writing-a-query-to-add-multiple-values-to-a-key-in-redis-hashes

    【讨论】:

    • 正如我所说,我想避免为每个用户保存一个密钥
    【解决方案3】:

    事实上@ruhul 的回答是一个很好的解决方案。但是,如果您坚持将所有用户的信息保存在一个密钥中,您可以尝试以下解决方案。

    按照您的尝试将信息保存在HASH 中。当您需要将新动物附加到给定用户时。您可以使用HGET 命令获取他已经拥有的动物。然后将新的动物添加到字符串中,并使用HSET 命令更新他的动物信息。

    为了使其具有原子性,您可以将此逻辑包装成Lua scripting

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2012-10-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多