文章目录
目录
前言
主要介绍了redis的发布的订阅功能和事务功能。
一、发布的订阅
- 客户端订阅频道/模式
- 数据结构
- 频道
- 在redisServer结构里面通过pubsub-channels字典保存订阅服务器频道的客户端相关信息
- pubsub-channels.key=频道
- pubsub-cahnnels.value=订阅该频道的客户端组成的链表
- 模式
- redisServer的pubsub-patterns链表保存订阅服务器模式的客户端相关信息
- 每个链表节点pubsubPattern通过client属性存客户端和pattern属性存客户端订阅的模式
- 频道
- 订阅/退订频道
- SUBSCRIBE
- 如果之前已经有某个客户端订阅该频道,则在pubsub-channels里通过频道key找到客户端values链表,并在尾部加入新的客户端
- 如果没有订阅过该频道,则在pubsub-channels里创建一个新的频道key,并且将客户端加入客户端链表value中
- SUBSCRIBE
- 通过频道key在pubsub-channels字典里找到客户端链表values,删除客户端节点
- 如果删除后,该频道没有任何订阅者,则删除该频道-客户端键值对
- SUBSCRIBE
- 订阅/退订模式
- PSUBSCRIBE
- 创建一个pubsubPattern结构,client属性存客户端,pattern属性存订阅的模式
- 将pubsubPattern结构加入到pubsub-partterns链表尾部
- UNPSUBSRIBE
- 找到对应的pubsubPatterns结构并从pubsub-patterns链表删除即可
- PSUBSCRIBE
- 数据结构
- 客户端向频道发布信息
也就是想向订阅该频道的客户端发送命令,通过向服务器发送PUBLISH命令,然后服务器找到订阅频道的客户端,然后再相这些客户端发送命令- PUBLISH向某个频道/模式发送message消息
- 频道:从pubsub-channels里找到频道key对应的订阅者客户端链表values,遍历这个链表向他们发送message消息,如果这个频道与某个模式相关联,会再根据频道关联的pattern去pubsub-patterns里找到对应的pubsubPattern,向其中client属性指定的客户端发送message信息
- 模式:根据模式pattern从pubsub-patterns里找到pubsubPattern,向其中client属性指定的客户端发送message信息
- 客户端通过PUBSUB命令查看服务器订阅信息
- PUBSUB CHANNELS (pattern):返回服务器中被订阅的所有频道,或者与pattern模式向关联的被订阅的频道
- PUBSUB NUMSUB (channel-1,channel-2,...):返回频道channel-1,channel-2,...的订阅者客户端数量
- PUBSUB NUMPAT:返回服务器被订阅的模式数量
二、事务
- 事务执行过程
- MULTI开始事务
- 命令入队
- 让一个错误命令入队,所有命令无法正常执行
- 让一个正确的但是无法正常执行的命令入队,该命令会执行失败。但是队列中的其他命令可以正常执行
- EXEC顺序执行事务队列中的命令
- 在执行EXEC时,客户端会先检查自己的CAS标识有没有被打开,被打开则不能执行命令
- WATCH
- 服务器维持一个watch字典记录客户端对服务器键值的监视状态,key是数据库键,value是监视该键的客户端组成的链表
- 某个客户端对服务器发布一个修改数据库键值的写命令后,服务器会检查watch字典,看看有没有客户端监视该键,如果有会打开这些客户端的CAS标识,表示事物一致性被破坏
- ACID
- 部分原子性:没有回滚策略,队列中某个命令执行报错不会影响其他命令的正确执行(但是如果入队的命令就是一个错误命令,这个事务会整体执行失败)
- 一致性、隔离性
- 限定情况的持久性:只有在AOF持久化策略,appendsync选项配置为alway且没有打开rewriteaof时停止同步标识时,才有持久性