Redis存储Redis哈希值中的值列表

时间:2018-03-28 07:16:37

标签: redis

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

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

我尝试使用hash,其中每个字段都是user_id,每个值都是连接的动物字符串。例如:{"1234" : "dog cat", "8477" : "bird dog"}。在这里,只需拨打一次Redis电话,我就可以为用户获取动物" 1234"

我知道有一个APPEND命令,可以将项追加到字符串中。但这不适用于在哈希中附加值。

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

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

3 个答案:

答案 0 :(得分:4)

如果您不想为每个用户保留单独的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"

答案 1 :(得分:1)

  

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

在redis中,您可以随意创建任意数量的密钥。因此,您可以做的是使密钥附加 user_id<hash_key> 。维护该密钥的哈希集/列表。例如:

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

答案 2 :(得分:0)

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

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

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