中间件—实现redis点到点队列,以保证任何使用者都能处理一次消息

vnjpjtjt  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(271)

redis为pubsub提供了非常好的实现,在pubsub中,发布在一个通道上的消息将由注册主题的多个接收器接收。
实现点到点(即队列)语义的理想方法是什么?例如,多个接收者在一个队列中注册,消息一推送到队列,就只有一个接收者(侦听者)处理它?任何java参考示例都会有所帮助。
这里的想法是读取包含事务记录的巨大文件,因此每个事务只应处理一次。
我可以看到redis streams的建议,但我没有看到一个健全的java参考实现

u2nhd7ah

u2nhd7ah1#

只是使用 LPUSH msgqueue 要将项目放入列表并让所有客户端执行以下操作:

while running
    BRPOP msgqueue
    # process popped item
done
a7qyws3x

a7qyws3x2#

请注意,没有像pubsub主题那样的直接实现。在这里使用queue的另一个原因是publish subscribve中也没有持久订阅,即当订阅者未启动时,发送的消息将丢失。但下面的队列实现将节省一点。
最终答案
lpush test\u queue测试消息llen test\u queue brpop test\u 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);
}
}

相关问题