检查列表中是否存在值Redis

Reu*_*Reu 40 redis

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

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

谢谢.

小智 64

您的选择如下:

  1. LREM如果找到则使用并替换它.
  2. SET与您的一起保持独立LIST
  3. 循环LIST直到找到物品或到达终点.

Redis列表实现为http://en.wikipedia.org/wiki/Linked_list,因此存在限制.

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


Ber*_*set 25

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

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

我很惊讶没有人建议你使用哈希表排序,它结合了允许双重性的优点(通过存储元素的数量作为值- 哈希表,或得分- 排序集)和索引成员的性质的哈希台/套.


哈希表

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

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


排序集

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

  • ZSCORE
  • ZRANK
  • ZREVRANK

nil如果指定的成员不存在,则返回答案.

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


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


Rav*_*ina 19

您也可以使用LPOS.

当该项目存在时,它返回一个指示位置的数字:

LPOS mylist myitem
3
Run Code Online (Sandbox Code Playgroud)

如果不是,它返回nill

LPOS mylist myitem_which_do_not_exits
(nil)
Run Code Online (Sandbox Code Playgroud)


Lin*_*iel 5

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

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


小智 5

令我惊讶的是,没有人提到这个套装,它完美地解决了这个问题。
使用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
Run Code Online (Sandbox Code Playgroud)

  • “没有人提到这一组”。除了提问者之外,就是这样。 (5认同)