2012-02-16 83 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

相關問題