假设您在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