【问题标题】:Remove element at specific index from redis list从 redis 列表中删除特定索引处的元素
【发布时间】:2015-10-13 08:32:16
【问题描述】:

是否可以删除 redis 列表中特定索引处的元素?没有真正找到我想要的。 trim 允许您选择一组特定的元素,LREM 允许您按值删除列表中的项目,但我没有该值。

我发现了一个技巧,您可以使用 LSET 将元素的值更改为 UID 或字符串,例如'DELETED',并且你在这个值上调用 LREM。不过这感觉有点脏。

【问题讨论】:

标签: ruby redis


【解决方案1】:

我能够根据使用 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 使用该值并将其从列表中删除。

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

【讨论】:

  • 但如果该值在列表中出现多次,LREM 将删除第一次出现,而不是您要定位的特定值。
  • 你是对的。我更新了答案以反映该信息。谢谢
  • 这很奇怪,因为它不会是 O(1)。它不必搜索它吗?列表如何保持顺序。如果有秩序,我相信,那么你将不知道要删除哪一个。假设您正在按大小进行迭代。你可以做 lindex 然后说你建立一个要删除的索引列表,你不能知道你现在确实在删除。当然我可以通过其他可能的东西进行迭代,但很奇怪。我怀疑列表基本上是地图,以索引为键。但随后该值用于删除...
  • 这么奇怪,你可以按索引访问,但不能按索引删除。为什么?需要寻找价值。此外,您不能对列表说从某个索引开始删除一个值。它的头部或尾部意味着您不能确定要删除相同的索引。
【解决方案2】:

因此,完成我想要的唯一方法是将索引处的值设置为预先确定的字符串,然后按值进行删除。

在这里查看讨论https://groups.google.com/forum/#!topic/redis-db/c-IpJ0YWa9I

在红宝石中如下

@redis.lset("#{@namespace}/#{specified_queue}", index, "DELETED")
@redis.lrem("#{@namespace}/#{specified_queue}", 1, "DELETED")

LSET 文档http://redis.io/commands/lset LREM 文档http://redis.io/commands/lrem

【讨论】:

  • 这很奇怪,因为它不会是 O(1)。它不必搜索它吗?列表如何保持顺序。
  • 这么奇怪,你可以按索引访问,但不能按索引删除。为什么?需要寻找价值。此外,您不能对列表说从某个索引开始删除一个值。它的头部或尾部意味着您不能确定要删除相同的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
相关资源
最近更新 更多