16

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

4

3 回答 3

22

您可以使用 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

于 2012-06-04T14:57:17.327 回答
2

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

http://redis.io/commands/rpoplpush

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

于 2013-03-08T06:30:14.587 回答
1

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

LRANGE <LIST> 0 0

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

RedisTemplate 中有类似的东西吗?

于 2012-06-04T14:32:40.140 回答