Redis列表,不删除地弹出元素

19

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

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

3
“pop”一词通常用于“移除并返回”的上下文中(至少应该这样)。 - brimborium
4个回答

24

通过使用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


3
有没有一种在Redis中弹出一个项目但不删除它并使其在过期期间处于休眠状态的方法?在过期期间(而且它没有被删除),这个项目会醒来,可以再次弹出。 http://redis.io/commands/rpoplpush 模式:可靠队列 Redis通常用作消息服务器,以实现后台作业或其他类型的消息任务的处理。通过将值推入生产者侧的列表,并使用RPOP(使用轮询)或BRPOP(如果客户端更适合阻塞操作)在消费者侧等待该值,通常获得简单的队列。 然而,在这种情况下,获得的队列不可靠,因为消息可能会丢失,例如在存在网络问题时或者如果消费者在接收到消息后崩溃但仍需处理时。 RPOPLPUSH(或阻塞变体BRPOPLPUSH)提供了一种避免这个问题的方法:消费者获取消息并同时将其推送到处理列表中。一旦处理完消息,它将使用LREM命令从处理列表中删除消息。 另一个客户端可以监视处理列表中停留时间过长的项目,并在需要时将超时的项目重新推回队列中。

2

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

LRANGE <LIST> 0 0

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

RedisTemplate中是否有类似于此的功能?


这很好,但是返回队列头部的元素,而不是尾部。当执行RPOP时,您会弹出尾部的元素,因此需要一种解决方案来弹出该元素,而不将其从队列中删除。 - coterobarros
你需要将 LRANGELLEN 结合起来使用。使用 LLEN 获取队列中的元素数量 n,并在 LRANGE n n 中使用该数字获取队列的前 n 个元素。 - coterobarros

1

您可以使用RedisTemplate获取Redis中的值列表,如下所示。

Long size = redisTemplate.opsForList().size(key); Object object = hashOperationsList.range(key, 0, size );

这样可以避免从缓存中删除值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接