假設您在Redis中具有LIST數據類型。你如何刪除所有的條目?我已經試過這個了:刪除Redis列表中的所有條目
LTRIM key 0 0
LTRIM key -1 0
這兩個都留下第一個元素。這將留下所有元素:
LTRIM key 0 -1
我沒有看到單獨的命令來完全清空列表。
假設您在Redis中具有LIST數據類型。你如何刪除所有的條目?我已經試過這個了:刪除Redis列表中的所有條目
LTRIM key 0 0
LTRIM key -1 0
這兩個都留下第一個元素。這將留下所有元素:
LTRIM key 0 -1
我沒有看到單獨的命令來完全清空列表。
刪除密鑰,將清除所有項目。根本沒有這個清單類似於沒有任何項目。當您嘗試訪問不存在的密鑰時,Redis不會拋出任何異常。
DEL key
這是一些控制檯日誌。
redis> KEYS * (empty list or set) redis> LPUSH names John (integer) 1 redis> LPUSH names Mary (integer) 2 redis> LPUSH names Alice (integer) 3 redis> LLEN names (integer) 3 redis> LRANGE names 0 2 1) "Alice" 2) "Mary" 3) "John" redis> DEL names (integer) 1 redis> LLEN names (integer) 0 redis> LRANGE names 0 2 (empty list or set)
在一個原子操作中有辦法做到這一點嗎? (「LRANGE名稱0 2」和「DEL名稱」) – refaelos 2013-10-14 10:44:47
是的。請參閱Redis事務處理 - http://redis.io/topics/transactions – Anurag 2013-10-14 21:20:58
有一件事,使用Del'可能會產生額外開銷, 時間複雜度:O(N)其中N是將要刪除的鍵的數量。當一個要刪除的鍵持有一個字符串以外的值時,這個鍵的個體複雜度是O(M),其中M是列表中元素的數量,集合,排序集合或散列值。刪除包含字符串值的單個鍵是O(1)。 [docs](http://redis.io/commands/del) – 2014-05-15 22:46:56
您可以刪除在列表中的所有值只有的列表有多個值
LTRIM key -1 0
例子:
redis 127.0.0.1:6379> RPUSH mylist four 1 3 1
(integer) 4
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
6) "mylist"
redis 127.0.0.1:6379> LTRIM mylist -1 0
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
(empty list or set)
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
但如果該列表具有一個值onl y,您必須使用
DEL key
接受的答案是錯誤的。假設我有
redis 127.0.0.1:6379> KEYS *
1) "newKey"
2) "firstHash"
3) "secondList"
4) "test4"
5) "firstList"
6) "mylist"
使用ahmed的例子,這實際上是正確的。 現在,如果我這樣做:
DEL 'test4'
我結束了:
1) "newKey"
2) "firstHash"
3) "secondList"
4) "firstList"
5) "mylist"`
所以,我沒有從 'TEST4' 列表中刪除所有的條目,我刪除 TEST4 本身。不是一回事。一點也不。我有一個小應用程序,其中列表鍵是從幾個數據計算出來的散列(好吧,不是全部?),那些列表有時會被清除,但空列表和不存在列表的語義是非常不同的。 所以,不,我不想DEL'myhashes',我只想刪除所有條目。
當心,哦,你們在這裏徘徊。
如果你看下面引用的頁面,你會看到實際上語義是一樣的!採用[from](http://redis.io/topics/data-types#lists):'LPUSH命令在頭部插入一個新元素,而RPUSH在尾部插入一個新元素。對空鍵執行其中一個操作時會創建一個新列表。類似地,如果列表操作將清空列表,則將密鑰從密鑰空間中移除。這些都是非常方便的語義,因爲如果使用不存在的鍵作爲參數調用空列表,則所有列表命令的行爲將完全相同。「來自馬嘴的 – Dominic 2014-01-20 08:46:32
:」類似地,將鍵從鍵空間中移除if列表操作將清空列表。「所以,是{[],[],[]} === {[]}?不適合我。我想我們在不同的拓撲空間.... :) – deimosaffair 2014-01-22 08:59:09
那麼最初的問題是如何刪除redis中的整個列表。所以如果您刪除密鑰或刪除所有條目,並讓redis自動刪除的密鑰提供相同的結果。所以我不確定你對{[],[],[]} === {[]}的含義。 – Dominic 2014-01-23 09:49:41
我正在接聽我的手機,所以無法真正格式化答案。
這可能是一個遲到的反應,但我堅持在這裏,以防萬一有人仍然需要這種功能。
短的答案
LTRIM MYLIST 0 - (N + 1) 其中MYLIST是鍵並且n是MYLIST的長度。
朗答案
的方式LTRIM作品是,它需要兩個指標,並返回落在它們之間的包容性指數的元素。
LTRIM列表的startIndex endIndex的
實施例假設我們有與包含10個條目鍵MYLIST一個redis的列表:通過對索引5
LTRIM MYLIST 0 5 將修剪列表以從索引0開始的元件。拋棄那些超出範圍的人。
幸運的是,redis列表操作支持負向索引,這在某些情況下證明非常有用。通常當你不知道列表的長度。
-1表示最後一個元素, - 2倒數第二個元素等。(-n)是第一個元素。
超出範圍的索引是無害的。如果結束索引大於列表的長度,則redis將其視爲等於最後一個索引。
這就是爲什麼ltrim mylist 0, - (n +1)清除列表。它是這樣做的,因爲(-n)等於索引0.向其添加1不會在該範圍內留下任何元素,因爲它將位於第一個元素之前。
感謝您分享您的見解。作爲答案的延伸,您可以簡單地提供一個比列表大得多的N值,以保證所有項目都被刪除。例如'ltrim mylist 0 -99999'。 – 2018-01-06 00:09:36
@DavidJames:考慮它另一種拼寫「foo」的方式。我遵循Redis自己的文檔中使用的慣例:http://redis.io/commands/ – 2012-08-13 19:59:51
是的,在redis中,所有數據結構都是鍵。這並不意味着'關鍵'在一個例子中是有用的。恰恰相反,我想。使用'mylist'會讓你的問題更清晰。例如,http://redis.io/commands/ltrim/寫道:'LTRIM mylist 1 -1'。您引用的頁面是一個命令*參考*,不應被視爲制定優秀示例的「約定」。 – 2012-08-13 20:41:34