【发布时间】:2012-02-16 14:16:52
【问题描述】:
我想知道是否有办法检查一个键是否已经存在于 redis 列表中?
我不能使用集合,因为我不想强制唯一性,但我确实希望能够检查字符串是否确实存在。
【问题讨论】:
标签: redis
我想知道是否有办法检查一个键是否已经存在于 redis 列表中?
我不能使用集合,因为我不想强制唯一性,但我确实希望能够检查字符串是否确实存在。
【问题讨论】:
标签: redis
您的选择如下:
LREM 并在找到时替换它。LIST 一起维护一个单独的SET
LIST,直到找到该项目或到达终点。Redis 列表被实现为 http://en.wikipedia.org/wiki/Linked_list,因此存在局限性。
我认为您最好的选择是保持重复的SET。这是我倾向于做的事情。只需将其视为一个额外的索引。无论如何,请确保您的操作是使用 MULTI-EXEC 或 Lua 脚本的原子操作。
【讨论】:
SET。
LREM 是 O(N),其中 N 是列表的长度,但 SREM 1 个元素的复杂度是 O(1),因为 N 是要删除的成员数. SISMEMBER 总是 O(1)。
列表允许重复,但不提供检查是否存在的简单方法,正如@Fritzy 建议的那样,您需要:
我很惊讶没有人建议您使用 Hash Table 或 Sorted Set,它们结合了 允许重复的优点(通过将元素的数量存储为值-哈希表,或分数-排序集)和索引成员的性质一个哈希表/集合。
要检查密钥是否存在,请使用HEXISTS 指定特定字段,如果指定成员不存在则返回0。
你也可以使用HGETcommand。如果指定的成员不存在,则返回nil 答案。
要添加新成员,只需使用HINCRBY 即可更新值(即具有成员名称的元素的数量)或创建新成员(如果不存在)。
要检查密钥是否存在,请使用以下三个命令之一:
ZSCOREZRANKZREVRANK如果指定的成员不存在,它们会返回 nil 答案。
要添加新成员,只需使用ZINCRBY 即可更新分数(即具有成员名称的元素的数量)或创建新成员(如果不存在)。
总而言之:排序集或哈希表允许您根据您的要求使用单个命令进行所有操作。。 p>
【讨论】:
我很惊讶没有人提到 set,它完美地解决了这个问题。
使用 set 中的 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
【讨论】:
您也可以使用LPOS。
当项目存在时,它返回一个指示位置的数字:
LPOS mylist myitem
3
如果不返回nill:
LPOS mylist myitem_which_do_not_exits
(nil)
注意事项:
【讨论】:
不,没有办法检查 redis 列表是否包含给定值。参考Redis list commands。
我猜您可以使用LREM 来(尝试)删除该值,并检查返回值是否已删除。但是你必须把它放回去,这看起来很可疑。您的问题可能有更好的解决方案 - 您想要完成什么?
【讨论】:
hset - 并使用setnx,当然这与拥有真实列表并不完全相同,但哈希表是无论如何,通常查找速度更快。