【问题标题】:How to perform lrange + (delete the result of lrange from list) on Redis list如何在 Redis 列表上执行 lrange +(从列表中删除 lrange 的结果)
【发布时间】:2017-02-04 15:13:45
【问题描述】:

我知道 rpop 会删除 Redis 列表的最后一个元素。如何在特定范围(例如:0 到 100)之间弹出列表项?

我希望这是 lrange + rpop 的组合。

【问题讨论】:

    标签: caching redis


    【解决方案1】:

    要选择并删除前 100 个元素(从左侧开始):

    LRANGE list 0 99
    LTRIM list 100 -1
    

    选择和删除最后 100 个元素(从右侧开始):

    LRANGE list -1 -100
    LTRIM list 0 -99
    

    来自 LTRIM 的旧版 redis 文档:

    修剪列表name,删除不在startend 之间的切片内的所有值。 startend 可以是负数,就像 Python 切片符号一样

    【讨论】:

      【解决方案2】:

      您需要结合 lrangeltrim 来实现此目的。

      http://redis.io/commands/ltrim

      编辑: 正如 cmets 中所建议的,正确的答案是

      lrange list 0 99
      ltrim list 100 -1
      

      【讨论】:

      • 只有 ltrim 还不够吗?
      • Ltrim 的回复还行。如果你想要你需要的值 lrange,在得到之后你可以发出 ltrim 将它们从列表中删除。将它们组合在一个 lua 中以使其成为原子
      • 这在几个层面上是不正确的。首先得到你想要做的前 100 个项目LRANGE list 0 99,然后 LTRIM 做的事情与你所说的相反,它留下前 100 个项目并删除其他所有项目。如果您想删除前 100 个项目,您需要执行 LTRIM list 100 -1(即保留从项目 100 开始的所有内容)但更重要的是,这是非常不安全的,因为此操作不是原子操作,因此列表可能会在第一个和第二个之间更改声明 - 你需要弄清楚如何使它成为原子
      • @mlasevich 事务是避免这种非原子性不一致的好方法吗?
      【解决方案3】:

      据我所知,没有预定义的命令可以从列表中弹出一系列项目。 您必须向 redis 发送一系列 rpop 命令。 Redis 通常会发送很多短命令,因此连续发送 100 条(甚至 1000 条)rpop 命令是没有问题的。 为了提高性能,您可以使用“流水线”在一个操作中发送多个命令。执行此操作的具体方法取决于您的驱动程序。

      另一种方法是编写 Lua 脚本并使用 eval 发送它

      【讨论】:

        【解决方案4】:

        去掉前100个元素,应该是:

        lrange 列表 0 99 ltrim 列表 100 -1

        去掉尾部前100个元素,应该是:

        范围列表 -100 -1 ltrim 列表 0 -101

        【讨论】:

        • 接受的答案对我不起作用,但确实如此。我说的是反向选项,lrange list -100 -1 ltrim list 0 -101
        【解决方案5】:

        聚会有点晚了,但如果你想原子地做所有事情,你可以使用 multi/exec 命令。

        读取和删除两个元素的示例。

        1. 准备一些虚拟数据作为示例:
        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"
        
        1. 启动事务块
        127.0.0.1:6379> multi
        OK
        
        1. 对需要的命令进行排队(读取前两个元素并删除它们)。
        127.0.0.1:6379> lrange mylist 0 1
        QUEUED
        127.0.0.1:6379> ltrim mylist 2 -1
        QUEUED
        
        1. 执行命令
        127.0.0.1:6379> exec
        1) 1) "1"
           2) "2"
        2) OK
        
        1. 验证一切顺利。同样,只是为了举例。
        127.0.0.1:6379> lrange mylist 0 -1
        1) "3"
        2) "4"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-20
          • 2016-05-29
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          相关资源
          最近更新 更多