美文网首页MySQLLinux + Redis
redis+springboot实现消息队列(发布订阅模式)

redis+springboot实现消息队列(发布订阅模式)

作者: sakura_L | 来源:发表于2019-12-23 15:39 被阅读0次

    一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。

    定义:
    生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。(pop操作)
    发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的。

    Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。如下图所示:

    由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的。

    在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
    从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

    Redis List的主要操作为lpush/lpop/rpush/rpop四种,分别代表从头部和尾部的push/pop,除此之外List还提供了两种pop操作的阻塞版本blpop/brpop,用于阻塞获取一个对象。

    简单说下实现步骤:
    1、使用redisTemplate调用converAndSend消息发布


    image.png

    2、RedisConfig里面配置取消息的方式或者监听者


    image.png
    这里有两种方式,第一种是通过不同的listener来实现要做的事情,di是通道。
    image.png

    第二种是通过MessageListenerAdapter适配器来分别实现消费。
    做过安卓的人对适配器的理解应该比较深刻。


    image.png image.png
    后面的方法A 与 config里面对应。由Adapter里面源码
    image.png
    可以看出如果没有这个方法就会抛出对应的异常。
    测试类:
    image.png
    结果如下:
    image.png
    项目地址:
    https://github.com/SakuraLxm/redis.git

    相关文章

      网友评论

        本文标题:redis+springboot实现消息队列(发布订阅模式)

        本文链接:https://www.haomeiwen.com/subject/dqdznctx.html