Redis应用场景很多,现在介绍一下它的几大特性之一   发布订阅(pub/sub)

特性介绍:

  什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能。基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。熟悉设计模式的朋友应该了解这与23种设计模式中的观察者模式极为相似。 

     同样,Redis的pub/sub是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,  Redis作为一个pub/sub的server, 在订阅者和发布者之间起到了消息路由的功能。

  上面的都是概念,不知道没关系,其实我也看不懂。

简单来讲,这里面还有个channel的概念,这里就是频道的意思,比如你订阅了银行的频道,当你的资金发生变动时,银行就会通过它的频道给你发送信息,在这里,你是属于被动接收的,而不是向银行索要信息,这个例子中,你就是sub(订阅者),而银行就是pub(发布者)。

 

代码:

先引入依赖

  1. <dependency>  
  2. 2.9.0</version>  
  3. </dependency>  

新建一个发布者

  1. publicclassextends
  2. privatefinal
  3.     
  4. public
  5. this.jedisPool = jedisPool;  
  6.     
  7. @Override
  8. publicvoid
  9. newnew
  10. //连接池中取出一个连接
  11. whiletrue) {  
  12. null;  
  13. try
  14. if"quit".equals(line)) {  
  15. "mychannel", line);   //从 mychannel 的频道上推送消息
  16. else
  17. break;  
  18. catch
  19. }  

新建一个订阅者

  1. publicclassextends
  2.     
  3. public
  4. @Override
  5. publicvoid//收到消息会调用
  6. "receive redis published message, channel %s, message %s", channel, message));  
  7. @Override
  8. publicvoidint//订阅了频道会调用
  9. "subscribe redis channel success, channel %s, subscribedChannels %d",  
  10. @Override
  11. publicvoidint//取消订阅 会调用
  12. "unsubscribe redis channel, channel %s, subscribedChannels %d",  
  13.     
  14. }

订阅频道

  1. publicclassextends
  2. privatefinal
  3. privatefinalnew
  4.     
  5. privatefinal"mychannel";  
  6.     
  7. public
  8. super("SubThread");  
  9. this.jedisPool = jedisPool;  
  10.     
  11. @Override
  12. publicvoid
  13. "subscribe redis, channel %s, thread will be blocked", channel));  
  14. null;  
  15. try
  16. //取出一个连接
  17. //通过subscribe 的api去订阅,入参是订阅者和频道名
  18. catch
  19. "subsrcibe channel error, %s", e));  
  20. finally
  21. ifnull) {  
  22. }  
  23.    

测试下

  1. publicclass
  2. publicstaticvoid
  3. // 连接redis服务端
  4. newnew"172.31.12.18", 7379);  
  5.     
  6. "redis pool is starting, redis ip %s, redis port %d", "127.0.0.1", 7379));  
  7.     
  8. new//订阅者
  9.     
  10. new//发布者
  11. }  

 

打印信息

java redis 广播消息 redis广播模式_java redis 广播消息