我的任务是获取特定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:"。但是当我有太多项目时,这不是规模。
我可以做些什么来完成我的任务?
答案 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"];
有关详细信息,请查看以下链接:
答案 2 :(得分:0)
事实上@ ruhul的答案是一个很好的解决方案。但是,如果您坚持在一个密钥中保存所有用户的信息,则可以尝试以下解决方案。
按照您的尝试将信息保存在HASH
中。当您需要将新动物附加到给定用户时。您可以使用HGET
命令获取他已有的动物。然后将新动物添加到字符串中,并使用HSET
命令更新其动物信息。
为了使其成为原子,您可以将此逻辑包装为Lua scripting。