检查列表中是否存在值Redis

时间:2012-02-16 14:16:53

标签: redis

我想知道是否有办法检查redis列表中是否已存在密钥?

我不能使用集合,因为我不想强制执行唯一性,但我确实希望能够检查字符串是否实际存在。

感谢。

5 个答案:

答案 0 :(得分:64)

您的选择如下:

  1. 使用LREM并在找到后将其替换。
  2. SET
  3. 一起维护单独的LIST
  4. 循环浏览LIST,直至找到该项目或到达目的地。
  5. Redis列表实现为http://en.wikipedia.org/wiki/Linked_list,因此存在限制。

    我认为您最好的选择是保留重复SET。这就是我倾向于做的事情。只需将其视为额外索引。无论如何,请使用MULTI - EXEC或Lua脚本确保您的操作是原子的。

答案 1 :(得分:23)

列表允许重复但不提供检查存在的简单方法,正如@Fritzy建议的那样,您需要:

  • 进行多项操作(如果在删除期间找到,则删除然后再次添加)以进行简单检查= 及时成本
  • 维持单独的设置= 内存成本

我很惊讶没有人建议您使用哈希表 已排序设置,它们结合了允许两面性的优点(通过将元素数量存储为值 - 哈希表,或得分 - 排序集)和索引成员的性质哈希表/集。


哈希表

要检查密钥是否存在,请对特定字段使用HEXISTS,如果指定的成员不存在,则返回0。 您也可以使用HGET命令。如果指定的成员不存在,它将返回nil个答案。

要添加新成员,只需使用HINCRBY,它将更新值(即具有成员名称的元素数)或创建新成员(如果不存在)。


排序集

要检查密钥是否存在,请使用以下三个命令之一:

  • ZSCORE
  • ZRANK
  • ZREVRANK

如果指定的成员不存在,他们会返回nil个答案。

要添加新成员,只需使用ZINCRBY即可更新分数(即具有成员名称的元素数量),或创建新成员(如果不存在)。


总结:排序集哈希表允许您使用单个命令完成符合要求的所有操作

答案 2 :(得分:5)

不,无法检查redis列表是否包含给定值。请参阅Redis list commands以供参考。

我猜您可以使用LREM来(尝试)删除该值,并检查返回值以查看它是否已被删除。但是你必须把它放回去,这似乎是不确定的。你的问题可能有一些更好的解决方案 - 你想要完成什么?

答案 3 :(得分:4)

令我惊讶的是,没有人提到设置,它完美地解决了这个问题。
使用集合中的 sismember键值,它会检查该值是否为键的成员。
这是示例:

redis 127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
redis 127.0.0.1:6379> SISMEMBER myset1 "hello"
(integer) 1
redis 127.0.0.1:6379> SISMEMBER myset1 "world"
(integer) 0

答案 4 :(得分:1)

您也可以使用LPOS

当该项目存在时,它会返回表示位置的数字:

LPOS mylist myitem
3

如果不返回,则返回nill

LPOS mylist myitem_which_do_not_exits
(nil)