redis 笔记06 发布与订阅、事务、慢查询日志、监视器
发布与订阅
1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责
解除客户端和被退订频道之间的关联。
2. 服务器状态在pubsub_patterns链表保存了所有模式的订阅关系:PSUBSCRIBLE命令负责将客户端和被订阅的模式记录到这个链表中,而PUNSBUSCRIBLE命令则负
责移除客户端和被退订模式在链表中的记录。
3. PUBLISH命令通过访问pubsub_channels字典来向频道的所有订阅者发送消息,通过访问pubsub_patterns链表来向所有匹配频道的模式的订阅者发消息。
4. PUBSUB命令的三个子命令都是通过读取pubsub_channels字典和pubsub_patterns链表中的信息来实现的。
5. 链表统一来管理订阅者。
事务
1. 事务提供了一种将多个命令打包,然后一次性、有序执行的机制
2. 多个命令被入队到事务队列中,然后按先进先出的顺序执行
3. 事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。
4. 带有WATCH命令的事务会将客户端和被监控的键在数据库的watch_keys字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标志打开。
5. 只有在客户端的REDIS_IDRTY_CAS标志未被打开时,服务器才会执行客户端提交的事务,否则的话,服务器将拒绝执行客户端提交的事务。
6. Redis事务总是具有ACID中的原子性、一致性和隔离性,当服务器运行在AOF持久化模式下,并且appendfsync选项值为always时,事务也具有耐久性。
7. Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器
不会中断事务而去执行其他客户端请求,它会将事务中的所有命令都执行完。然后才会去处理其他客户端的命令请求。
8. 一个事务从开始到结束通常会经历一下三个阶段:
1). 事务开始:MULTI
2). 命令入队:
3). 事务执行:EXEC
9. 客户端切换到事务状态后,服务器会根据这个客户端发来的不同命令执行不同的操作:
1). 如果发的命令为:EXEC、DISCARD 、WATCH 、MULTI 四个命令中的一个,那么服务器立即执行这个命令
2). 如果不是上面几条命令,那么服务器并不会立即执行这个命令,而是将这个命令放入一个事务队列中,然后向客户端返回QUEUED回复。
10. WATCH命令是一个乐观锁,他可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务。
并向客户端返回代表事务执行失败的空回复。
11. 监视机制的触发:为被监视的键设置一个属性值,当被监视的键被修改时,改变属性,标记该键已被修改。事务执行前,检查该属性值。(思想)
12. Redis 不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
13. ACID :
原子性(Atomicity):数据库将事务中的多个操作当做一个整体来执行,服务器要么执行事务中所有的操作,要么就一个操作都不执行。Redis事务是原子性的,但不保证所有执行命令都成功。
一致性(Consistency) : 如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否执行成功,数据库也应该仍然是一致的。
隔离性(Isolation): 即使数据库有多个事务并发执行,各个事务之间也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。Redis使用单线程的方式来执行事务。
持久性(Durability):当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性介质(比如磁盘)里面了,即使服务器在事务执行完毕之后停机,执行事务所得的结果也不会丢失。
慢查询日志
1. Redis的慢查询日志功能用于记录执行时间超过指定时长的命令。用户可以通过这个功能产生的日志来监控和优化查询速度。
2. Redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含了一个slowlogEntry结构,每个slowlogEntry结构代表一个慢查询日志。
3. 打印和删除慢查询日志可以通过遍历slowlog链表来完成。
4. slowlog链表的长度就是服务器所保存慢查询日志的数量。
5. 新的慢查询日志会被添加到slowlog链表的表头,如果日志的数量超过slowlog-max-len选项的值,那么多出来的日志会被删除。
6. 服务器配置有两个和慢查询日志相关的选项:
1). slowlog-log-slower-than选项指定执行时间超过多少微秒的命令请求会被记录到日志上。
2). slowlog-max-len选项指定服务器最多保存多少条慢查询日志。服务器使用先进先出的方式保存多条慢查询日志,当服务器存储的慢查询日志数量等于slowlog-max-len选项的值时,服务器在添加
一条新日志前,会现将旧的一条慢查询日志删除。
7. 使用SLOWLOG GET 命令查看服务器所保存的慢查询日志
8. 添加新日志:在每次执行命令之前和之后,程序都会记录微秒格式的UNIX时间戳,这两个时间戳之间的差就是服务器执行命令所耗费的时长,服务器根据这个时长决定是否保存这条查询日志。
监视器:
1. 客户端通过执行MONITOR命令,将客户端转换成监视器,接收并打印服务器处理每个命令请求的相关信息。
2. 当一个客户端从普通客户端变成监视器时,该客户端的REDIS_MONITOR标识会被打开。
3. 服务器将所有监视器都记录在monitors链表中。
4. 每次处理命令请求时,服务器都会遍历monitors链表,将相关信息发送给监视器。