【Redis基础】发布与订阅

发布与订阅

1.定义

Redis的发布与订阅是由publish、subscribe、psubscribe等命令组成的

2.频道的订阅与退订

(1)订阅

  • 当一个客户端执行subscribe命令订阅某个频道,该客户端就与被订阅频道之间构成了一种订阅关系。

  • 所有频道的订阅关系保存在服务器状态的pubsub_channel字典里,该字典的键是某个被订阅的频道,值是一个链表,记录了所有订阅这个链表的客户端。
    图解
    【Redis基础】发布与订阅

(2)退订

  • 当一个客户端执行unsubscribe命令退订某个频道,该客户端就与被订阅频道就解除了订阅关系。

  • 服务器将从pubsub_channels字典中找到频道对应的链表,从订阅者链表中删除退订客户端的信息

3.模式的订阅与退订

(1)订阅模式

  • 服务器将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性中。

  • pubsub_patterns属性是一个链表,链表中的每个节点都包含着一个pubsub_patterns结构

  • 当客户端执行psubscribe命令订阅某个模式时,服务器会新建一个pubsubPattern结构,将结构的pattern属性设置为被订阅的模式,client属性设置为订阅模式的客户端。将pubsubPattern结构添加到pubsub_patterns链表的末尾
    图例
    【Redis基础】发布与订阅

(2)退订模式

  • 当客户端执行punsubscribe命令时,服务器会在pubsub_patterns链表中查找并删除那些pattern属性是被退订模式,client属性是执行命令的客户端的pubsubPattern结构。

4.发送消息

  • 将消息发送给频道订阅者
    若客户端执行publish命令,那将在字典中查找该频道,并通过遍历链表将消息发送给该频道的所有订阅者。

  • 将消息发送给模式订阅者
    若客户端执行publish命令(模式),那将在pubsub_patterns链表中查找与该模式匹配的频道,将消息发送给匹配的频道订阅者。

  • 查看订阅消息的三个命令

    • pubsub channels :返回服务器当前被订阅的频道
    • pubsub numsub:参数可以是任意多个频道,返回某些频道的订阅者数量
    • pubsub numpat:返回服务器当前被订阅模式的数量

慢查询日志

1.定义

慢查询日志功能用于记录执行时间超过给定时长的命令请求

2.配置参数

  • slowlog-log-slower-than:指定执行时间超过多少微秒的命令请求会被记录到日志上。

  • slowlog-max-len:指定服务器最多保存多少条慢查询日志

注:服务器使用先进先出的方式保存多条慢查询日志信息,添加一条新的慢查询日志之前会将最旧的一条慢查询日志删除。

3.结构

  • 所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表的节点都包含一个slowlogEntry结构,每个slowlogEntry结构代表一条慢查询日志

  • 打印和删除慢查询日志可以通过遍历slowlog链表来完成

  • slowlog链表的长度就是服务器所保存的慢查询日志的数量

  • 新的慢查询日志会被添加到slowlog链表的表头

虚拟内存

1.定义

暂时把不经常访问的数据从内存交换到磁盘中,

2.作用

在redis中,使用虚拟内存将不经常访问的数据交换到磁盘上,从而提高数据库容量。

3.配置

  • Vm-enabled yes :开启vm功能
  • Vm-swap-file E:/Redis/vm.swap :交换出来的value保存的文件路径。
  • Vm-max-memory 100000 :redis使用的最大内存上限
  • Vm-max-threads 4 :用于执行value对象换入的工作线程数量
  • Vm-page-size 32 :每个页面的大小是32字节
  • Vm-pages 13456 :最多使用多少页面

4.处理策略

内存容量超过maxmemory后的处理策略。

  • volatile-lru:利用LRU算法移除设置过过期时间的key。
  • volatile-random:随机移除设置过过期时间的key。
  • volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)
  • allkeys-lru:利用LRU算法移除任何key。
  • allkeys-random:随机移除任何key。
  • noeviction:不移除任何key,只是返回一个写错误。

监视器

  • 执行monitor命令,客户端就可以将自己变成一个监视器,实时的接收并打印出服务器当前处理的命令请求的相关信息。

  • 服务器将所有的监视器都记录在monitors链表中。

  • 每次处理命令请求时,服务器都会遍历monitors链表,将相关信息发送给监视器。



本人才疏学浅,若有错,请指出,谢谢!

参考书籍:《Redis设计与实现(第二版)》—黄健宏