Redis做消息中间件MQ

本文介绍了Redis的发布订阅功能及其在Springboot项目中的应用,同时讨论了多实例环境下可能导致的消息重复消费问题。为解决此问题,提出了使用Redis List通过PUSH POP操作实现队列的方案,详细阐述了生产者和消费者如何操作List,并提供了相关代码示例。
摘要由CSDN通过智能技术生成

Redis提供有【pub sub】功能,即我们常说的发布和订阅

Redis的pub sub功能相较于常见的RabbitMQ等消息中间件还是有一些差异,在使用前需要进行甄别,确认是否适用当前项目,毕竟技术选型脱离现实是耍流氓。
  • 订阅方: 订阅某个channel后,当有消息发布至channel中时,订阅方会接收到推送而来的消息。(订阅时,channel名可以是明确的,也可以是通配的方式

  • 发布方: 向指定的channel发布一条message。


关于【pub sub】功能,Redis共提供了六个命令:

  • PUBLISH:发布消息
  • SUBSCRIBE:订阅指定channel
  • PSUBSCRIBE:通配方式订阅channel
  • UNSUBSCRIBE:取消订阅指定channel
  • PUNSUBSCRIBE:通配方式取消订阅channel
  • PUBSUB:查看订阅与发布状态信息

Springboot项目使用Redis pub sub功能

网上有很多这方面的文章,这里就不贴了,使用难度不大。


注意点

由于服务基本都是多实例部署,当实例中订阅了某个channel时,也就意味着多个实例都订阅了同一个channel,于是就会导致同一个消息会被多个实例同时消费,产生了重复处理的情况。

此时不管是做订阅方的幂等,还是分布式锁,还是配置文件增加开关控制,都会增加开发和运维的复杂度,同时增加很大不确定性。

这时候Redis其实还有一种变相的替代方案:Redis list,利用PUSH POP方式来实现队列。

  • 生产方使用lpush命令,向指定list中左侧增加一个元素。
  • 消费方写一个死循环,使用brpop命令,从指定list中右侧获取一个元素

这样等于使用了一个有序的list方式,实现一个先进先出的队列。

对应spring-data-redis的方法:

  • redisTemplate.opsForList().leftPush(key, msg);
  • redisTemplate.opsForList().rightPop(key, timeout, unit);
@Component
@Slf4j
public class RedisPublisherDemo {
   
	@Autowired
    private StringRedisTemplate redisTemplate;

	public void redisListLeftPush(String key, String msg) {
   
        redisTemplate.opsForList().leftPush(key, msg);
    }
}

@Component
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis作为消息中间件的原因是因为它可以作为缓存,并且在互联网项目中被广泛使用。在引入新的组件时,我们需要考虑其必要性。如果Redis本身的消息队列功能已经能够满足大多数需求,为什么还要引入消息队列(MQ)呢?\[1\] Redis虽然没有像MQ一样支持丰富的消息传播能力,但在大多数场景中已经足够使用了。Redis提供了list数据类型和pop、push方法,允许我们像使用队列一样操作list。另外,Redis还支持发布订阅模式,类似于其他消息队列的实现方式\[3\]。 在使用Redis作为消息中间件时,我们可以编写消费者类来监听消息,并在接收到消息时进行相应的处理。例如,可以创建一个RedisMessageListener类实现MessageListener接口,通过RedisTemplate来处理消息\[2\]。 总之,Redis作为消息中间件的选择是因为它的缓存功能和在互联网项目中的广泛应用。虽然它的消息队列功能相对简单,但在大多数场景中已经足够使用了\[1\]\[3\]。 #### 引用[.reference_title] - *1* *3* [异步消息中间件的门面组件easy-asyn(二):进阶篇(Redis消息中间件的使用)](https://blog.csdn.net/qq_28802119/article/details/100608257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [如何用redis消息中间件](https://blog.csdn.net/qq_41435009/article/details/127995482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值