【发布时间】:2012-06-08 14:37:24
【问题描述】:
我在我的 Java 应用程序中使用 RedisTemplate(来自 Spring)。我需要从对应值的元素列表中弹出,但不删除它。有什么建议吗?
【问题讨论】:
-
术语
pop总是用在“删除并返回”的上下文中......(至少应该)
我在我的 Java 应用程序中使用 RedisTemplate(来自 Spring)。我需要从对应值的元素列表中弹出,但不删除它。有什么建议吗?
【问题讨论】:
pop 总是用在“删除并返回”的上下文中......(至少应该)
您可以使用 range 命令轻松查看项目而不是弹出项目。
使用 Spring,从 RedisTemplate 实例中,您可以使用 opsForList() 方法获取 ListOperations 实例,然后:
listOp.range(key, 0, 0) 将返回第一个(左侧)项目而不弹出它
listOp.range(key, -1, -1) 将返回最后一个(右)项而不弹出它
参见文档:
【讨论】:
Redis 中是否有任何方法可以在不删除项目的情况下弹出项目,但在过期期间保持休眠状态?过期(且未删除)后,此项目唤醒并可以再次弹出。
http://redis.io/commands/rpoplpush
模式:可靠队列 Redis 通常用作消息传递服务器,以实现处理后台作业或其他类型的消息传递任务。一种简单的队列形式通常是在生产者端将值推送到一个列表中,并在消费者端使用 RPOP(使用轮询)等待这个值,或者如果客户端通过阻塞操作更好地服务,则使用 BRPOP。 然而,在这种情况下,获得的队列是不可靠的,因为消息可能会丢失,例如在存在网络问题的情况下,或者如果消费者在收到消息后立即崩溃但仍需处理。 RPOPLPUSH(或阻塞变体的 BRPOPLPUSH)提供了一种避免此问题的方法:消费者获取消息并同时将其推送到处理列表中。处理完消息后,它将使用 LREM 命令从处理列表中删除消息。 额外的客户端可能会监视处理列表中保留时间过长的项目,并在需要时将那些超时的项目再次推送到队列中。
【讨论】:
不确定如何使用 RedisTemplate 执行此操作,但要从列表中获取值,您可以使用 redis 命令:
LRANGE <LIST> 0 0
获取第一个值,其中 是列表的名称。
RedisTemplate 中有类似的东西吗?
【讨论】: