Redis订阅广播实现多级缓存
Redis应用场景很多,现在介绍一下它的几大特性之一 发布订阅(pub/sub)
特性介绍:
什么是redis的发布订阅(pub/sub)? Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。熟悉设计模式的朋友应该了解这与23种设计模式中的观察者模式极为相似。
同样,Redis的pub/sub是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合, Redis作为一个pub/sub的server, 在订阅者和发布者之间起到了消息路由的功能。
上面的都是概念,不知道没关系,其实我也看不懂。
简单来讲,这里面还有个channel的概念,这里就是频道的意思,比如你订阅了银行的频道,当你的资金发生变动时,银行就会通过它的频道给你发送信息,在这里,你是属于被动接收的,而不是向银行索要信息,这个例子中,你就是sub(订阅者),而银行就是pub(发布者)。
代码:
先引入依赖
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.9.0</version>
- </dependency>
新建一个发布者
- public class Publisher extends Thread{
- private final JedisPool jedisPool;
- public Publisher(JedisPool jedisPool) {
- this.jedisPool = jedisPool;
- }
- @Override
- public void run() {
- BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
- Jedis jedis = jedisPool.getResource(); //连接池中取出一个连接
- while (true) {
- String line = null;
- try {
- line = reader.readLine();
- if (!"quit".equals(line)) {
- jedis.publish("mychannel", line); //从 mychannel 的频道上推送消息
- } else {
- break;
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
新建一个订阅者
- public class Subscriber extends JedisPubSub {
- public Subscriber(){}
- @Override
- public void onMessage(String channel, String message) { //收到消息会调用
- System.out.println(String.format("receive redis published message, channel %s, message %s", channel, message));
- }
- @Override
- public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用
- System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",
- channel, subscribedChannels));
- }
- @Override
- public void onUnsubscribe(String channel, int subscribedChannels) { //取消订阅 会调用
- System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",
- channel, subscribedChannels));
- }
- }
订阅频道
- public class SubThread extends Thread {
- private final JedisPool jedisPool;
- private final Subscriber subscriber = new Subscriber();
- private final String channel = "mychannel";
- public SubThread(JedisPool jedisPool) {
- super("SubThread");
- this.jedisPool = jedisPool;
- }
- @Override
- public void run() {
- System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
- Jedis jedis = null;
- try {
- jedis = jedisPool.getResource(); //取出一个连接
- jedis.subscribe(subscriber, channel); //通过subscribe 的api去订阅,入参是订阅者和频道名
- } catch (Exception e) {
- System.out.println(String.format("subsrcibe channel error, %s", e));
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
- }
测试下
- public class PubSubDemo {
- public static void main( String[] args )
- {
- // 连接redis服务端
- JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "172.31.12.18", 7379);
- System.out.println(String.format("redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 7379));
- SubThread subThread = new SubThread(jedisPool); //订阅者
- subThread.start();
- Publisher publisher = new Publisher(jedisPool); //发布者
- publisher.start();
- }
- }
打印信息

Redis订阅广播实现多级缓存的更多相关文章
- redis订阅发布消息操作本地缓存
Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存 ...
- Redis 多级缓存架构和数据库与缓存双写不一致问题
采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存 ...
- Redis: 缓存过期、缓存雪崩、缓存穿透、缓存击穿(热点)、缓存并发(热点)、多级缓存、布隆过滤器
Redis: 缓存过期.缓存雪崩.缓存穿透.缓存击穿(热点).缓存并发(热点).多级缓存.布隆过滤器 2019年08月18日 16:34:24 hanchao5272 阅读数 1026更多 分类专栏: ...
- 【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)
一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...
- 带你100% 地了解 Redis 6.0 的客户端缓存
近日 Redis 6.0.0 GA 版本发布,这是 Redis 历史上最大的一次版本更新,包括了客户端缓存 (Client side caching).ACL.Threaded I/O 和 Redis ...
- 有赞透明多级缓存解决方案(TMC)设计思路
引子 TMC 是什么 TMC,即"透明多级缓存(Transparent Multilevel Cache)",是有赞 PaaS 团队给公司内应用提供的整体缓存解决方案. TMC 在 ...
- Redis整合Spring结合使用缓存实例(三)
一.Redis介绍 什么是Redis? redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...
- Redis整合Spring结合使用缓存实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...
- Redis整合Spring结合使用缓存实例(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...
随机推荐
- springMVC接受json类型数据
springMVC接受json格式的数据很简单 使用@RequestBody 注解,标识从请求的body中取值 服务端示例代码 @RequestMapping(value = "/t4&qu ...
- java方法可变参数研究
1 问题引出 (1)缘由 最近在研究如何在项目中引入Redis缓存,于是遇到可变参数这个疑惑点,之前没有好好研究过,为了避免项目后期出现问题. (2)项目相关技术 SpringBoot Redis K ...
- 【PR笔记】一、打造希区柯克变焦效果
1. 导入素材,“链接选择项”关闭,删除音频 2. 添加效果--视频效果--扭曲--视频稳定器, 然后程序帮我们自动稳定 3.视频首尾添加关键帧,首帧缩放200% 尾帧不变, 使视频前后的主体大小差 ...
- NOIP2009-2018简要题解
口胡警告 NOIP2009 潜伏者 模拟 Hankson 的趣味题 对四个数\(a_0,a_1,b_0,b_1\)分解质因数,结果序列分别记为\(\{p1^{b1}\},\{p2^{b2}\},\{p ...
- idea内存溢出解决方法
在Run/Debug configuration 的vm options里面输入 -server -XX:PermSize=128M -XX:MaxPermSize=256m eclipse: -Xm ...
- MFC基础笔记
List Control // List Control初始化,下面代码需要放在OnInitDialog()函数里面// 设置扩展风格:正行选中 m_list.SetExtendedStyle(LVS ...
- sql循环-游标、临时表、表变量
游标 在游标逐行处理过程中,当需要处理的记录数较大,而且游标处理位于数据库事务内时,速度非常慢. -- 声明变量 DECLARE @Id AS Int -- 声明游标 DECLARE C_Id CUR ...
- 【Struts2】文件上传与下载
一.上传 1.1 Struts2实现步骤 浏览器端 服务器端 1.2 关于Struts2中文件上传细节: 1.3 示例 jsp文件 Action类 struts.xml文件配置 二.下载 2.1 文件 ...
- Delphi 抽象方法
- MySQL跨表更新SQL
1 sql范式 把s表中的city_name的值设置为city表中的name,关联条件是city_code 和 code update student s, city c set s.city_na ...