删除Redis列表中的所有条目


81

假设您在Redis中具有LIST数据类型。如何删除其所有条目?我已经尝试过了:

LTRIM key 0 0
LTRIM key -1 0

两者都离开了第一个要素。这将保留所有元素:

LTRIM key 0 -1

我没有看到单独的命令来完全清空列表。


2
@DavidJames:考虑这是另一种拼写“ foo”的方法。我遵循Redis自己的文档中使用的约定:redis.io/commands
Paul A Jungwirth

是的,在redis中,所有数据结构都是键。这并不意味着“键”在示例中很有用。我认为恰恰相反。使用mylist会使您的问题更清楚。例如,redis.io/commands/ltrim写道:LTRIM mylist 1 -1。您引用的页面是命令参考,不应被视为提供良好示例的“惯例”。
David J.

Answers:


150

删除密钥,这将清除所有项目。完全没有列表类似于其中没有任何项目。当您尝试访问不存在的密钥时,Redis不会引发任何异常。

DEL key

这是一些控制台日志。

redis>按键*
(空列表或集合)
redis> LPUSH命名John
(整数)1
redis> LPUSH为玛丽命名
(整数)2
redis> LPUSH命名爱丽丝
(整数)3
redis> LLEN名称
(整数)3
redis> LRANGE名称0 2
1)“爱丽丝”
2)“玛丽”
3)“约翰”
redis> DEL名称
(整数)1
redis> LLEN名称
(整数)0
redis> LRANGE名称0 2
(空列表或集合)

有没有办法在一个原子操作中做到这一点?(“ LRANGE名称0 2”和“ DEL名称”)
refaelos13年

1
使用Del的一件事,may create extra overhead时间复杂度:O(N)其中N是将被删除的键的数量。当要删除的键包含字符串以外的值时,该键的单个复杂度为O(M),其中M是列表,集合,排序集合或哈希中元素的数量。删除包含字符串值的单个键为O(1)。该文档
ChewOnThis_Trident

1
此方法很危险,因为它也会删除密钥的ttl
ita玉县

16

您可以删除所有值列表 只有名单有多于一个值

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"

但是,如果List仅具有一个值,则必须使用

DEL key 

4

只需使用LTRIM即可。... aaaa,这里的魔力是使用start 大于 end

LTRIM key 99 0

还有...轰!这里有整个元素列表。只是* * *就在眼前!!没有残留物,绝对没有问题问。

注意:这将导致键被“删除”(如删除)所描述的在这里

...如果start大于列表的末尾,或者start> end,则结果将是一个空列表(这将导致键被删除)。


您是否有理由喜欢DEL key@Anurag的答案?似乎它们具有相同的效果。
Paul A Jungwirth '18

坦率地说,不,没有时间研究基准测试,当我发现上述方法时,我只是在阅读文档,我想可能还会提到它。
Mohd Abdul Mujib

1
好的谢谢!由于我可以想象LTRIM重复使用的算法,因此受到鼓舞,并且很高兴知道第二个参数低于第一个参数时会发生什么。我可以看到利用这种行为如何使某些代码更优雅。
Paul A Jungwirth,

0

公认的答案是错误的。假设我有

redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 

用艾哈迈德的例子,这实际上是正确的。现在,如果我这样做:

DEL 'test4'

我最终得到:

1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "firstList" 
5) "mylist"` 

所以,我没有从“TEST4”列表中删除所有的条目,我删除TEST4本身。不一样的东西。一点也不。我有一个小应用程序,其中列表键是根据几个数据计算得出的哈希值(嗯,不是全部吗?),有时会清除这些列表,但是空列表和不存在的列表的语义有很大不同。所以,不,我不想删除'myhashes',我只想删除所有条目。

当心,哦,谁在这里徘徊。


如果您看下面引用的页面,您会发现实际上语义是相同的!采取The LPUSH command inserts a new element on the head, while RPUSH inserts a new element on the tail. A new list is created when one of this operations is performed against an empty key. Similarly the key is removed from the key space if a list operation will empty the list. These are very handy semantics since all the list commands will behave exactly like they were called with an empty list if called with a non-existing key as argument.
多米尼克

从马口说:“类似地,如果列表操作将清空列表,则从密钥空间中删除密钥。” 因此,{[],[],[]} === {[[]}?不适合我。我猜我们处于不同的拓扑空间中。...:)
deimosaffair 2014年

好吧,最初的问题是如何在Redis中删除整个List。因此,如果您删除密钥或删除所有条目并通过Redis自动删除密钥,则会得到相同的结果。因此,我不确定您对{[],[],[]} === {[]}的含义。
多米尼克2014年

从列表中删除最后一个元素等于删除键。此链接即使同为LIST以及(与RPOPLPUSH测试) bennadel.com/blog/...
Kanagavelu Sugumar

0

我尝试了这个,对我有用。只需将myList更改为您的列表名称并执行即可 redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
尽管此方法有效,keys
但却

0

这可能是一个较晚的响应,但如果有人仍然需要该功能,则将其粘贴在此处。

简短答案

ltrim mylist 0-(n + 1)其中,mylist是键,n是mylist的长度。

长答案

ltrim的工作方式是,它需要两个索引并返回包含在两个索引之间的元素。

Ltrim列表startIndex endIndex

假设我们有一个redis列表,其键mylist包含10个条目:

ltrim mylist 0 5将把列表修剪为从索引0到索引5的元素,并丢弃那些超出该范围的元素。

幸运的是,redis列表操作支持负索引,这在某些情况下非常有用。通常,当您不知道列表的长度时。

-1表示最后一个元素,-2是倒数第二个元素,依此类推。(-n)是第一个元素。

超出范围的索引无害。如果结束索引大于列表的长度,则redis将其视为等同于最后一个索引。

这就是为什么ltrim mylist 0,-(n +1)清除列表的原因。这样做是因为(-n)等于索引0。对其添加1不会在该范围内保留任何元素,因为该范围将在第一个元素之前。


感谢您分享您的见解。作为答案的扩展,您可以简单地提供一个大于列表的N值,以确保删除所有项目。例如ltrim mylist 0 -99999
戴夫·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.