2012-03-22 59 views
53

假設您在Redis中具有LIST數據類型。你如何刪除所有的條目?我已經試過這個了:刪除Redis列表中的所有條目

LTRIM key 0 0 
LTRIM key -1 0 

這兩個都留下第一個元素。這將留下所有元素:

LTRIM key 0 -1 

我沒有看到單獨的命令來完全清空列表。

+2

@DavidJames:考慮它另一種拼寫「foo」的方式。我遵循Redis自己的文檔中使用的慣例:http://redis.io/commands/ – 2012-08-13 19:59:51

+0

是的,在redis中,所有數據結構都是鍵。這並不意味着'關鍵'在一個例子中是有用的。恰恰相反,我想。使用'mylist'會讓你的問題更清晰。例如,http://redis.io/commands/ltrim/寫道:'LTRIM mylist 1 -1'。您引用的頁面是一個命令*參考*,不應被視爲制定優秀示例的「約定」。 – 2012-08-13 20:41:34

回答

94

刪除密鑰,將清除所有項目。根本沒有這個清單類似於沒有任何項目。當您嘗試訪問不存在的密鑰時,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) 
+0

在一個原子操作中有辦法做到這一點嗎? (「LRANGE名稱0 2」和「DEL名稱」) – refaelos 2013-10-14 10:44:47

+0

是的。請參閱Redis事務處理 - http://redis.io/topics/transactions – Anurag 2013-10-14 21:20:58

+1

有一件事,使用Del'可能會產生額外開銷, 時間複雜度:O(N)其中N是將要刪除的鍵的數量。當一個要刪除的鍵持有一個字符串以外的值時,這個鍵的個體複雜度是O(M),其中M是列表中元素的數量,集合,排序集合或散列值。刪除包含字符串值的單個鍵是O(1)。 [docs](http://redis.io/commands/del) – 2014-05-15 22:46:56

11

您可以刪除在列表中的所有值只有列表有多個值

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 
-1

接受的答案是錯誤的。假設我有

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',我只想刪除所有條目。

當心,哦,你們在這裏徘徊。

+0

如果你看下面引用的頁面,你會看到實際上語義是一樣的!採用[from](http://redis.io/topics/data-types#lists):'LPUSH命令在頭部插入一個新元素,而RPUSH在尾部插入一個新元素。對空鍵執行其中一個操作時會創建一個新列表。類似地,如果列表操作將清空列表,則將密鑰從密鑰空間中移除。這些都是非常方便的語義,因爲如果使用不存在的鍵作爲參數調用空列表,則所有列表命令的行爲將完全相同。「來自馬嘴的 – Dominic 2014-01-20 08:46:32

+0

:」類似地,將鍵從鍵空間中移除if列表操作將清空列表。「所以,是{[],[],[]} === {[]}?不適合我。我想我們在不同的拓撲空間.... :) – deimosaffair 2014-01-22 08:59:09

+0

那麼最初的問題是如何刪除redis中的整個列表。所以如果您刪除密鑰或刪除所有條目,並讓redis自動刪除的密鑰提供相同的結果。所以我不確定你對{[],[],[]} === {[]}的含義。 – Dominic 2014-01-23 09:49:41

1

我正在接聽我的手機,所以無法真正格式化答案。

這可能是一個遲到的反應,但我堅持在這裏,以防萬一有人仍然需要這種功能。

短的答案

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不會在該範圍內留下任何元素,因爲它將位於第一個元素之前。

+0

感謝您分享您的見解。作爲答案的延伸,您可以簡單地提供一個比列表大得多的N值,以保證所有項目都被刪除。例如'ltrim mylist 0 -99999'。 – 2018-01-06 00:09:36