接上一篇文章,介绍了通过redis的发布订阅模式,实现轻量级的MQ方案
在实际生产中,我们放入通道中的信息往往希望只被消费一次,但是在部署多个服务的情况下,通道中的消息会被重复消费,这里就来解决这个问题。
文章结尾会附上redis订阅监听器(消费端)完整代码
重复消费的情况分两种:
1.多个消费端同时接收到消息,并发执行。
解决方案:消费端代码加redis分布式锁,来避免重复消费
加锁要在执行业务代码前进行,业务代码执行完成后可以释放锁减少内存消耗
// 加锁
Boolean flag = redisTemplate.opsForValue().setIfAbsent(taskId, "1", 300, TimeUnit.SECONDS);
// 加锁失败,已有消费端在此时对此消息进行处理,这里不再做处理
if (!flag) {
return;
}