什么是 Redis

Redis 是一个开源的使用 ANSI C语言编写的内存数据库,它以 key-value 键值对的形式存储数据,高性能,读取速度快,也提供了持久化存储机制。

Redis 通常在项目中用的最多的功能是缓存,然而今天靓仔将为你介绍它的另一个功能,轻量级的消息队列。

Redis 发布订阅

机制

Redis 提供了发布订阅功能,可以用于消息的传输,Redis 的发布订阅机制包括三个部分,发布者,订阅者和 Channel(称之为频道或主题)。

发布者将消息发布到指定频道,订阅该频道的订阅者就能够接受到这条消息,如果有多个订阅者,那么他们会接受到相同的消息。

功能实现

发布消息

Redis 采用 PUBLISH 命令发送消息,其返回值为接收到该消息的订阅者的数量。

订阅频道

Redis 采用 SUBSCRIBE 命令订阅某个频道,其返回值包括客户端订阅的频道,目前已订阅的频道数量,以及接收到的消息,其中subscribe表示已经成功订阅了某个频道。

模式匹配

模式匹配功能允许客户端订阅符合某个模式的频道,Redis采用PSUBSCRIBE订阅符合某个模式所有频道,用“ * ”表示模式,“ * ”可以被任意值代替。

假设客户端同时订阅了某种模式和符合该模式的某个频道,那么发送给这个频道的消息将被客户端接收到两次,只不过这两条消息的类型不同,一个是 message 类型,一个是 pmessage 类型,但其内容相同。

取消订阅

Redi s采用 UNSUBSCRIBE 和 PUNSUBSCRIBE 命令取消订阅,其返回值与订阅类似。由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。在 SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE 和 PUNSUBSCRIBE 命令中,其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态。

SpringBoot+Redis 实现发布订阅

springboot 如何整合 redis 我这里就不讲了,相信对你来说也没有一点问题。我们直接上代码

消息监听配置

@Configuration
public class RedisSubConfig { public static final String SUB_KEY = "chat";//频道channel /**
* redis消息监听器容器
* 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
* 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory); //订阅了一个频道
container.addMessageListener(listenerAdapter, new PatternTopic(RedisSubConfig.SUB_KEY));
return container;
} /**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
} /**
* redis 读取内容的template
* @param connectionFactory
* @return
*/
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}

接收消息

@Service
public class RedisReceiver { public void receiveMessage(String message) {
System.out.println("接收消息:" + message);
}
}

采用定时器发布消息

@EnableScheduling //开启定时器功能
@Component
public class MessageSender { @Autowired
private StringRedisTemplate stringRedisTemplate; @Scheduled(fixedRate = 5000) //间隔5s 通过StringRedisTemplate对象向redis消息队列chat频道发布消息
public void sendMessage(){
stringRedisTemplate.convertAndSend("chat", "hello "+ new Date());
}
}

运行结果

对比RabbitMQ发布订阅模式

  • Redis:轻量级,低延迟,高并发,低可靠性;
  • RabbitMQ:重量级,高可靠,异步,不保证实时;
  • RabbitMQ是一个专门的 AMQP 协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,而Redis主要是用于缓存的,Redis 的发布订阅模式,可用于实现及时性,且可靠性低的功能。

往期推荐

最详细的图文解析Java各种锁(终极篇)

一定要收藏的5个优秀的SpringCloud开源项目

一定要收藏的5个后台管理系统的前端框架

MySQL 三大日志你了解多少?

图文详解 23 种设计模式

▼更多精彩推荐,请关注靓仔▼

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(52)-美化EasyUI皮肤和图标
  2. 雾里看花般的迷茫--货运APP
  3. 使用Mybatis-Generator自动生成Dao、Model、Mapping代码
  4. 虚拟机安装Ubuntu三种网络模式
  5. JS魔法堂:精确判断IE的文档模式by特征嗅探
  6. Single Number-C++中的异或
  7. IIS 之 HTTP错误 404.17 - Not Found(请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。)
  8. HDU 4422 The Little Girl who Picks Mushrooms(简单题)
  9. 【POJ 3487】 The Stable Marriage Problem (稳定婚姻问题)
  10. poj1066
  11. 上传文件时 ContentType 浏览器差异
  12. ExcelPower_Helper插件功能简述与演示
  13. 通过拼接SQL字符串实现多条件查询
  14. RESTful levels、HATEOAS
  15. asp.net调用前台js调用后台代码分享
  16. mysql.user表中Host为%的含义
  17. 自建Kubernetes logtail日志采集客户端安装方式
  18. VS2013_CodeLens
  19. 加快mysql导入导出速度
  20. 【poj3294】 Life Forms

热门文章

  1. python+selenium基础篇,网页截图
  2. mybatis学习——实现分页
  3. 无网络的win10电脑之间实现相互共享文档
  4. 三、DNS子域授权
  5. 【NX二次开发】Block UI RGB颜色选择器
  6. sql把一个字段中的特定字符替换成其他字符
  7. Go语言判断一个字节的高位大于四
  8. JavaScript(1)高阶函数filter、map、reduce
  9. MVC,MVVM模式的理解
  10. eclipse语言怎么设置为中文