实现Redis点对点队列,保证消息任意一个消费者处理一次

Implement Redis point-to-point queue to guarantee message processing once by any consumer

Redis 对 PUBSUB 有很好的实现,其中发布在频道上的消息将被为该主题注册的多个接收者接收。

实现点对点(即队列)语义的理想方式是什么?多个接收者在一个队列中注册,一旦消息被推送到队列,它将仅由 1 个接收者(侦听器)处理?任何 Java 参考示例都会有所帮助。

这里的想法是读取一个包含交易记录的大文件,因此每个交易应该只处理一次。

我可以看到建议使用 Redis Streams,但我没有看到合理的 Java 参考实现

只需使用 LPUSH msgqueue 将项目放入列表并让所有客户执行:

while running
    BRPOP msgqueue
    # process popped item
done

请注意,没有像 PUBSUB 主题那样的直接实现。在这里使用 Queue 的另一个原因是 Publish Subscribve 中也没有持久订阅,即当订阅者未启动时发送消息时您的消息将丢失。但下面的队列实现会在这里节省一点。
最终答案

LPUSH TEST_QUEUE 测试消息 伦 TEST_QUEUE BRPOP TEST_QUEUE 0

Java 实施

while(true){
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
int keySize =this.pushOperation.size("TEST_QUEUE"); 
//iterate keySize {
redisTemplate.opsForList().leftPop("TEST_QUEUE",0, TimeUnit.SECONDS);
}
}