一.简单介绍

1.redis的发布订阅功能,很简单。
  消息发布者和消息订阅者互相不认得,也不关心对方有谁。
  消息发布者,将消息发送给频道(channel)。
  然后是由 频道(channel)将消息发送给对自己感兴趣的 消息订阅者们,进行消费。

2.redis的发布订阅和专业的MQ相比较

  1>redis的发布订阅只是最基本的功能,不支持持久化,消息发布者将消息发送给频道。如果没有订阅者消费,消息就丢失了。
  2>在消息发布过程中,如果客户端和服务器连接超时,MQ会有重试机制,事务回滚等。但是Redis没有提供消息传输保障。
  3>简单的发布订阅可以使用redis,根据业务需求选择。

二.spring boot 集成[spring boot 2.x]

1.pom.xml文件

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<!-- 使用redis的LUA脚本 需要序列化操作的jar-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>

2.redis的config

为redis添加消息适配器,绑定消息处理器

消息适配器 可以添加多个

package com.sxd.swapping.config;

import com.sxd.swapping.redisReceiver.RedisReceiver;
import com.sxd.swapping.redisReceiver.RedisReceiver2;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; /**
* @author sxd
* @date 2019/5/27 16:13
*/
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig { /**
* redis消息监听器容器
* 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
* 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter,
MessageListenerAdapter listenerAdapter2)
{
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory); //可以添加多个 messageListener
//可以对 messageListener对应的适配器listenerAdapter 指定本适配器 适配的消息类型 是什么
//在发布的地方 对应发布的redisTemplate.convertAndSend("user",msg); 那这边的就对应的可以消费到指定类型的 订阅消息
container.addMessageListener(listenerAdapter, new PatternTopic("user"));
container.addMessageListener(listenerAdapter2, new PatternTopic("goods")); return container;
} /**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
*
* receiveMessage 是默认监听方法 一般不变
* @param redisReceiver redis消息处理器,自定义的
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {
System.out.println("消息适配器1进来了");
return new MessageListenerAdapter(redisReceiver, "receiveMessage");
} /**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
*
* receiveMessage 是默认监听方法 一般不变
* @param redisReceiver2 redis消息处理器,自定义的
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter2(RedisReceiver2 redisReceiver2) {
System.out.println("消息适配器2进来了");
return new MessageListenerAdapter(redisReceiver2, "receiveMessage");
} //使用默认的工厂初始化redis操作模板
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
} @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
RedisSerializer keySerializer = new StringRedisSerializer();
// RedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
//key采用字符串反序列化对象
redisTemplate.setKeySerializer(keySerializer);
//value也采用字符串反序列化对象
//原因:管道操作,是对redis命令的批量操作,各个命令返回结果可能类型不同
//可能是 Boolean类型 可能是String类型 可能是byte[]类型 因此统一将结果按照String处理
redisTemplate.setValueSerializer(keySerializer);
return redisTemplate;
} }

3.创建几个消息处理器[处理消息订阅者  接收到消息后的业务]

package com.sxd.swapping.redisReceiver;

import org.springframework.stereotype.Service;

/**
*
* redis 订阅发布 消息接收器/处理器
* @author sxd
* @date 2019/5/30 17:12
*/
@Service
public class RedisReceiver { public void receiveMessage(String message) {
System.out.println("消息处理器1>我处理用户信息:"+message);
//这里是收到通道的消息之后执行的方法
//此处执行接收到消息后的 业务逻辑
}
}
package com.sxd.swapping.redisReceiver;

import org.springframework.stereotype.Service;

/**
* redis 订阅发布 消息接收器/处理器2
* @author sxd
* @date 2019/5/30 17:15
*/
@Service
public class RedisReceiver2 { public void receiveMessage(String message) {
System.out.println("消息处理器2>我处理商品信息:"+message);
//这里是收到通道的消息之后执行的方法
//此处执行接收到消息后的 业务逻辑
}
}

4.消息发布controller

@Autowired
RedisTemplate redisTemplate; /**
* redis 发布订阅pubsub
*/
@RequestMapping(value = "/redisPubSub")
public void redisPubSub(String msg){
if (msg.contains("用户")){
redisTemplate.convertAndSend("user",msg);
}else {
redisTemplate.convertAndSend("goods",msg);
}
}

测试:

发送请求:http://localhost:9666/redistest/redisPubSub?msg=用户---德玛西亚的用户

结果:

消息处理器1>我处理用户信息:用户---德玛西亚的用户

发送请求:http://localhost:9666/redistest/redisPubSub?msg=goods---德玛西亚的用商品

结果:

消息处理器2>我处理商品信息:goods---德玛西亚的用商品

【spring boot】【redis】spring boot 集成redis的发布订阅机制的更多相关文章

  1. Redis 学习(三) —— 事务、消息发布订阅

    一.Redis事务 Redis 提供的事务机制与传统的数据库事务有些不同,传统数据库事务必须维护以下特性:原子性(Atomicity), 一致性(Consistency),隔离性(Isolation) ...

  2. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  3. 【redis】-- springboot集成redis及使用

    springboot自动配置的redis并不是特别好用,所以需要我们使用原生的jedis, 1.添加依赖 2.在application文件中配置 # Redis服务器地址 redis.host= # ...

  4. nodejs redis 发布订阅机制封装

    最近项目使用redis,对publish 和 subscribe的使用进行了了解,并进行了封装. var config = require('../config/config'); var log = ...

  5. Redis 发布/订阅机制原理分析

    Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能.   这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...

  6. 六. Redis发布订阅机制

    发布订阅(pub/sub)是一种消息通信模式,主要是解除消息发布者和消息订阅者之间通信的耦合. Redis作为一个pub/sub的服务器,在订阅者和发布者之间起到了一个消息路由的功能.订阅者可以通过s ...

  7. redis消息通知(任务队列/优先级队列/发布订阅模式)

    1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...

  8. Redis消息通知(任务队列和发布订阅模式)

    Redis学习笔记(十)消息通知(任务队列和发布订阅模式) 1. 任务队列 1.1 任务队列的特点 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(produ ...

  9. 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总

    本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...

随机推荐

  1. Nginx配置实验反向代理

    l  实验要求 浏览器访问 8083.mine.com:8081 地址,(Nginx端口是8081)通过Nginx服务器反向代理监听请求,将请求转发到tomcat服务器上,实现真正内容的访问. l  ...

  2. shell脚本按当前日期输出日志

    shell脚本基本技能是设置变量,输出信息.如下: sh脚本输出到控制台 将以上脚本保存到test.sh脚本文件中,并赋予可执行权限:sudo chmod +x test.sh 执行脚本:bash t ...

  3. Mongodb基础 学习小结

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 ...

  4. LearnOpenGL.PBR.IBL

    概述: IBL:image based lighting,一种间接光照(indirect lighting)技术,将周围的环境存在一张环境贴图(基于现实世界或3D场景生成)里面,然后将环境贴图上的每一 ...

  5. Google开源PDF软件库

    Google开启了一个叫做PDFium的PDF软件库开源项目,开发人员能够将其纳入各种平台应用中. 据Google的Chromium项目的布道师François Beaufort称,PDFium将被包 ...

  6. luogu P1904 天际线

    分析 都知道是从左向右扫描 可是该维护什么,扫描什么? 注意想想怎么输出, 实际上它要的输出就是图形的轮廓,即每个突出块的左上节点的x,y 所以说, 我们可以把扫描线扫进的楼房放入线段树,扫出的楼房删 ...

  7. 基于 webdriver 的测试代码日常调试方python 篇

    看到论坛有人写了JAVA的测试代码日常设计,就给大家分享一下偶自己平时是如何测试测试代码的.主要基于python语言.基于 webdriver 的日常调试在 python交互模式下非常方便,打开pyt ...

  8. 283.移动零 关于列表list与remove原理*****(简单)

    题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 注意,该题目要求不开辟行的数组空间,在原数据上进行操作. 示例: 输入: [0,1,0,3,12 ...

  9. 【Sqlite】C#不同支持

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> ...

  10. wal2json docker 试用

    基于官方的release 构建了一个docker 镜像,以下是测试使用 环境准备 docker-compose 文件 version: "3" services:   mypg: ...