我想知道是否有办法检查redis列表中是否已存在密钥?
我不能使用集合,因为我不想强制执行唯一性,但我确实希望能够检查字符串是否实际存在。
感谢。
答案 0 :(得分:64)
您的选择如下:
LREM
并在找到后将其替换。SET
LIST
LIST
,直至找到该项目或到达目的地。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)
注意: