【发布时间】:2017-02-04 15:13:45
【问题描述】:
我知道 rpop 会删除 Redis 列表的最后一个元素。如何在特定范围(例如:0 到 100)之间弹出列表项?
我希望这是 lrange + rpop 的组合。
【问题讨论】:
我知道 rpop 会删除 Redis 列表的最后一个元素。如何在特定范围(例如:0 到 100)之间弹出列表项?
我希望这是 lrange + rpop 的组合。
【问题讨论】:
要选择并删除前 100 个元素(从左侧开始):
LRANGE list 0 99
LTRIM list 100 -1
选择和删除最后 100 个元素(从右侧开始):
LRANGE list -1 -100
LTRIM list 0 -99
来自 LTRIM 的旧版 redis 文档:
修剪列表
name,删除不在start和end之间的切片内的所有值。start和end可以是负数,就像 Python 切片符号一样
【讨论】:
您需要结合 lrange 和 ltrim 来实现此目的。
http://redis.io/commands/ltrim
编辑: 正如 cmets 中所建议的,正确的答案是
lrange list 0 99
ltrim list 100 -1
【讨论】:
LRANGE list 0 99,然后 LTRIM 做的事情与你所说的相反,它留下前 100 个项目并删除其他所有项目。如果您想删除前 100 个项目,您需要执行 LTRIM list 100 -1(即保留从项目 100 开始的所有内容)但更重要的是,这是非常不安全的,因为此操作不是原子操作,因此列表可能会在第一个和第二个之间更改声明 - 你需要弄清楚如何使它成为原子
据我所知,没有预定义的命令可以从列表中弹出一系列项目。 您必须向 redis 发送一系列 rpop 命令。 Redis 通常会发送很多短命令,因此连续发送 100 条(甚至 1000 条)rpop 命令是没有问题的。 为了提高性能,您可以使用“流水线”在一个操作中发送多个命令。执行此操作的具体方法取决于您的驱动程序。
另一种方法是编写 Lua 脚本并使用 eval 发送它
【讨论】:
去掉前100个元素,应该是:
lrange 列表 0 99 ltrim 列表 100 -1
去掉尾部前100个元素,应该是:
范围列表 -100 -1 ltrim 列表 0 -101
【讨论】:
lrange list -100 -1 ltrim list 0 -101。
聚会有点晚了,但如果你想原子地做所有事情,你可以使用 multi/exec 命令。
127.0.0.1:6379> rpush mylist 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> lrange mylist 0 1
QUEUED
127.0.0.1:6379> ltrim mylist 2 -1
QUEUED
127.0.0.1:6379> exec
1) 1) "1"
2) "2"
2) OK
127.0.0.1:6379> lrange mylist 0 -1
1) "3"
2) "4"
【讨论】: