zoukankan      html  css  js  c++  java
  • 【数据库】Redis(5)--Redis发布订阅

    Redis发布订阅

    Redis发布订阅模型就是Redis提供的一种简单的消息订阅消息消费的模式,可以实现简单的MQ模拟通信的功能。即Redis是可以用作消息订阅和发布实现的一种中间件,不仅仅是缓存,不仅仅是非关系型数据库。

    1.1.Redis发布订阅简介

    Redis发布订阅(public/subscribe)是一种消息通信模式:发布者(pub)发送消息,订阅者(sub)接收消息。

    Redis客户端可以订阅任意数量的频道。

     下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、clinet5和clinet1之间的关系:

     当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

    1.2.Redis发布订阅常用命令

    • subscribe chanel[,chanel2]

    表示订阅对应的频道信息,对应这个客户端就是订阅者(消费者):

    127.0.0.1:6379> SUBSCRIBE kuangshenshuo
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "kuangshenshuo"
    3) (integer) 1
    • public message

    表示发布对应消息信息message,对应消息的发送端(生产者):

    127.0.0.1:6379> PUBLISH kuangshenshuo hello,kuangshen
    (integer) 1
    127.0.0.1:6379> PUBLISH kuangshenshuo hello,maria
    (integer) 1
    127.0.0.1:6379> PUBLISH kuangshenshuo "hello,redis"
    (integer) 1

    可以看到对应频道下的消息接收方已经收到了发布方发来的消息:

     更多命令参考:Redis发布订阅命令

    1.3.Redis发布与订阅原理

    原理

    Redis通过publishsubscribepsubscribe等命令实现发布和订阅功能。

    通过subscribe命令订阅某频道后,redis-server里维护了一个字典字典的键就是一个个channel而字典的值则是一个链表链表中保存了所有订阅这个channel的客户端。subscribe命令的关键,就是将客户端添加到给定channel的订阅链表中

    通过publish命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找记录了订阅这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。

    Pub/Sub从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天、群聊等功能。

    使用场景

    • 实时消息系统

    • 实时聊天(频道当做聊天室,将信息回显给所有人即可)

    • 订阅,关注系统

    博文写作参考:

    菜鸟教程--Redis发布订阅

    狂神说Redis

  • 相关阅读:
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
    java io系列20之 PipedReader和PipedWriter
    java io系列19之 CharArrayWriter(字符数组输出流)
    java io系列18之 CharArrayReader(字符数组输入流)
    java io系列17之 System.out.println("hello world")原理
    java io系列16之 PrintStream(打印输出流)详解
    java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例
    java io系列14之 DataInputStream(数据输入流)的认知、源码和示例
  • 原文地址:https://www.cnblogs.com/yif0118/p/15143831.html
Copyright © 2011-2022 走看看