【问题标题】:Redis List, pop without removingRedis List,弹出不删除
【发布时间】:2012-06-08 14:37:24
【问题描述】:

我在我的 Java 应用程序中使用 RedisTemplate(来自 Spring)。我需要从对应值的元素列表中弹出,但不删除它。有什么建议吗?

【问题讨论】:

  • 术语pop 总是用在“删除并返回”的上下文中......(至少应该)

标签: java spring redis


【解决方案1】:

您可以使用 range 命令轻松查看项目而不是弹出项目。

使用 Spring,从 RedisTemplate 实例中,您可以使用 opsForList() 方法获取 ListOperations 实例,然后:

  • listOp.range(key, 0, 0) 将返回第一个(左侧)项目而不弹出它

  • listOp.range(key, -1, -1) 将返回最后一个(右)项而不弹出它

参见文档:

http://static.springsource.org/spring-data/data-keyvalue/docs/1.0.x/api/org/springframework/data/keyvalue/redis/core/RedisTemplate.html

http://static.springsource.org/spring-data/data-keyvalue/docs/1.0.x/api/org/springframework/data/keyvalue/redis/core/ListOperations.html

【讨论】:

    【解决方案2】:

    Redis 中是否有任何方法可以在不删除项目的情况下弹出项目,但在过期期间保持休眠状态?过期(且未删除)后,此项目唤醒并可以再次弹出。

    http://redis.io/commands/rpoplpush

    模式:可靠队列 Redis 通常用作消息传递服务器,以实现处理后台作业或其他类型的消息传递任务。一种简单的队列形式通常是在生产者端将值推送到一个列表中,并在消费者端使用 RPOP(使用轮询)等待这个值,或者如果客户端通过阻塞操作更好地服务,则使用 BRPOP。 然而,在这种情况下,获得的队列是不可靠的,因为消息可能会丢失,例如在存在网络问题的情况下,或者如果消费者在收到消息后立即崩溃但仍需处理。 RPOPLPUSH(或阻塞变体的 BRPOPLPUSH)提供了一种避免此问题的方法:消费者获取消息并同时将其推送到处理列表中。处理完消息后,它将使用 LREM 命令从处理列表中删除消息。 额外的客户端可能会监视处理列表中保留时间过长的项目,并在需要时将那些超时的项目再次推送到队列中。

    【讨论】:

      【解决方案3】:

      不确定如何使用 RedisTemplate 执行此操作,但要从列表中获取值,您可以使用 redis 命令:

      LRANGE <LIST> 0 0
      

      获取第一个值,其中 是列表的名称。

      RedisTemplate 中有类似的东西吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-02
        • 2014-01-30
        • 2016-02-07
        • 2019-10-02
        • 2023-03-31
        • 2020-01-26
        • 2016-12-05
        • 1970-01-01
        相关资源
        最近更新 更多