2012-03-22 131 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