Redis在Redis哈希中存储值列表。

4

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

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

我已经尝试使用哈希表,其中每个字段都是一个用户ID,每个值都是一个连接在一起的动物字符串。例如:{"1234" : "dog cat", "8477" : "bird dog"}。在这里,我可以通过一个对Redis的调用来获取用户“1234”的动物。

我知道有一个APPEND命令,它可以将项目附加到字符串中。但是,这对于附加到哈希内部的值不起作用。

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

我应该怎么做才能完成我的任务?

3个回答

11

如果您不想为每个用户保留单独的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,我找不到一个排序集合可以容纳的最大键数。你知道吗? - Eyal Ch
@EyalCh 你知道对于 Set/List/Hash 有同样的方法吗? - sazzad

4
Redis的数据结构不能嵌套在其他数据结构中,因此无法在Hash内部存储List。
在Redis中,您可以自由地创建任意数量的键。所以你可以做的是将键附加上"user_id"和"",并为该键维护一个hashSet/list。例如:
user_id:1234 =["dog", "cat"];
user_id:8477 =["bird", "dog"];

查看以下链接以获取更多详细信息:

  1. redis-在哈希中存储列表
  2. 写一个查询在Redis哈希中添加多个值

正如我所说,我想避免为每个用户保存一个密钥。 - Eyal Ch

0

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

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

为了使其具有原子性,您可以将此逻辑包装到Lua脚本中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接