从 Redis 列表中删除特定索引处的元素。

10

在Redis列表中是否可以删除特定索引处的元素?我没有找到我想要的。有一个trim命令,它允许您选择一组特定的元素,LREM允许您通过值从列表中删除项,但是我没有该值。

我发现了一个技巧,您可以使用LSET将元素的值更改为UID或字符串(例如“DELETED”),然后对此值调用LREM。但是这感觉有点不太好。


3
如果Redis的作者建议进行这个黑客攻击,那就值得尝试:https://groups.google.com/forum/#!topic/redis-db/c-IpJ0YWa9I - DhruvPathak
没问题,我想也是吧 :D - Donovan Thomson
2
旧功能请求 - https://github.com/antirez/redis/issues/550 - Ofir Luzon
1
有些人甚至会称其为语法糖,因为列表并不是访问索引的好数据结构 - 至少这种hack会将其完全公开两次 :) - Itamar Haber
2个回答

19

这很奇怪,因为它不会是O(1)。它不需要搜索吗?列表如何保持顺序。 - mjs
很奇怪,你可以通过索引访问,但不能通过索引删除。为什么?需要搜索值。此外,您无法告诉列表从特定索引开始删除值。它只能是头或尾,这意味着您无法确定是否正在删除相同的索引。 - mjs

4
我能够通过使用redis-cli基于索引来实现这个问题的解决方案。
INDEX=<index (starts at 0)>
redis-cli -h <host> -p <port> LREM <list name> 1 "$(redis-cli -h <host> -p <port> LINDEX <list name> $INDEX)"

LINDEX 找到索引值,然后 LREM 使用该值并从列表中删除它。

这里处理的是唯一值。这只会删除找到的第一个项目。


1
但是,如果该值在列表中出现多次,LREM 将删除第一次出现的而不是您想要定位的特定值。 - philraj
1
你说得对。我更新了答案以反映那一点信息。谢谢。 - D.F.
这很奇怪,因为它不会是O(1)。它不需要搜索吗?列表如何保留顺序。如果有顺序,我相信,那么你就不知道要删除哪一个。假设你正在按大小迭代。你可以使用lindex,然后说你构建了一个要删除的索引列表,但是之后你无法知道是否确实删除了正确的内容。当然,我可能会按其他方式进行迭代,但非常奇怪。我怀疑列表基本上是映射,索引是键。但是值用于删除... - mjs
很奇怪,你可以通过索引访问,但不能通过索引删除。为什么?需要搜索值。此外,您无法告诉列表从特定索引开始删除值。它只能是头或尾,这意味着您无法确定是否正在删除相同的索引。 - mjs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接