2012-02-16 82 views
34

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

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

谢谢。

回答

54

您的选项如下:

  1. 使用LREM和更换它,如果它被发现。
  2. 维护结合的独立SETLIST
  3. 循环通过LIST直到找到该项目或到达终点。

Redis列表实现为http://en.wikipedia.org/wiki/Linked_list,因此有局限性。

我认为你最好的选择是保持重复SET。这是我倾向于做的。只要把它看作一个额外的索引。无论如何,请确保您的操作与MULTI - EXEC或Lua脚本一致。

+1

+1对于MULTI-EXEC – maximus 2014-06-23 10:36:38

+0

@fritzy是否可以详细阐述如何实现SET/LIST或指向某处,谢谢。 – 2016-08-21 16:45:34

+0

因为LREM和SREM都是O(N),所以最好不要单独设置(除非你打算删除整个集合而不是逐个项目)。 – 2017-03-17 20:18:50

4

不,没有办法检查一个redis列表是否包含给定的值。请参阅Redis list commands以供参考。

我想你可以使用LREM来(尝试)删除值,并检查返回值,看看它是否被删除。但是,那么你将不得不把它放回去,而这似乎是不合适的。你的问题可能有一些更好的解决方案 - 你想完成什么?

+1

嗨linus,我想他是问是否存在“钥匙”。没有给定的值,因为你假设 – zotherstupidguy 2012-09-08 17:05:59

+0

@babydudecoder他说他想检查一个密钥已经存在于一个redis列表中。我认为他的关键是redis列表的值。 – 2014-09-25 04:17:41

+0

@Harry在大多数情况下,他似乎可以将列表替换为'hset' - 并使用'setnx',这与当然有一个真正的列表不太一样,但是散列表通常是快速查找的。 – user3467349 2015-02-03 19:33:36

21

列出允许重复,但不提供一个简单的方法来检查它是否存在,并为@Fritzy建议,您可能需要:

  • 使多个操作(删除然后重新添加被发现)进行简单的检查= 成本及时
  • 保持独立的一组= 成本在内存

我很惊讶没有人建议你使用一个哈希表排序其结合允许口是心非的优点(通过存储元件的数量作为数值- 哈希表,或评分- 有序集合),并通过自然分度部件散列表/集合。


哈希表

要检查键的存在,使用HGET命令。如果指定的成员不存在,则返回nil答案。

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


有序集合

要检查钥匙的存在,可以使用以下三个命令中的任何一个:

  • ZSCORE
  • ZRANK
  • ZREVRANK

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

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


综上所述:有序集合哈希表让你做出的所有操作符合您的要求用一个命令

+0

但是,如果有人使用有序集合,则无法确定列表中存在多个值的多个实例。如果我在列表中的任意位置具有值“Hello World”,那么只存储它出现的次数将无助于我找到这些实例的周围元素。 – 2016-07-17 14:50:14

+0

@AnuraagVaidya这是另一个问题,在回答已被问到的问题的当前背景下是不相关的。 – 2017-03-27 09:08:09

相关问题