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链表,将相关信息发送给监视器。
redis 笔记06 发布与订阅、事务、慢查询日志、监视器的更多相关文章
- StackExchange.Redis学习笔记(五) 发布和订阅
Redis命令中的Pub/Sub Redis在 2.0之后的版本中 实现了 事件推送的 发布订阅命令 以下是Redis关于发布和订阅提供的相关命令 SUBSCRIBE channel [channe ...
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
- Redis的消息发布和订阅
Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...
- Redis消息之发布与订阅
"发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...
- .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用
环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...
- Redis学习笔记九:独立功能之慢查询日志
Redis 的慢查询日志用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度. 服务器配置有两个相关选项: slowlog-log-slower-than 选项指 ...
- Redis | 第10章 二进制数组、慢查询日志和监视器《Redis设计与实现》
目录 前言 1. 二进制位数组 1.1 位数组的表示 1.2 GETBIT 命令的实现 1.3 SETBIT 命令的实现 1.4 BITECOUNT 命令的实现 1.5 BITOP 命令的实现 2. ...
- redis 实现消息发布和订阅
1,打开二个客户端机器 一个用于发布,一个用于接受 2,发布一个channel1 3,用另外一个客户端收听上面的客户端 4,当再次在发布的redis客户端 发布一个消息 其他所有订阅的客户端会自动收 ...
- Redis 之消息发布与订阅(publish、subscribe)
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 一般做群聊,聊天室,发布公告信息等.
随机推荐
- 解决.Net设置只读、隐藏后后台获取不到值的问题
在前台页面上放了几个textbox,用 ReadOnly=true设置不可编辑,用visible="False"设置不可见 用jquery给textbox赋值后在后台页面获取不到t ...
- iis7.5应用程序池模板永久性缓存初始化失败解决方法
错误: 针对应用程序池的模板永久性缓存初始化失败,这是由以下错误导致的: 无法为应用程序池创建磁盘缓存子目录.数据可能包含其他错误代码. 解决办法如下: 网上搜索的答案全都是修改3个目录的权限,给II ...
- SpringMVC 406 accept请求错误,没有加入将json序列化的包
在spring中使用@responsebody发现请求报406错误 jar包中缺少json序列化的相关的包!
- IEnumerable和IQueryable的区别
转自:http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html IEnumerable接口 公开枚举器,该枚举器支持在指定类型 ...
- Html语言基础
接触html有一段时间了,对html做简单的总结. 1.HTML基础标签 <p>这是段落</p> 浏览器中效果: 这是段落 -------------------------- ...
- iptables常用操作
1.iptables服务重启 service iptables restart 2.保存iptables规则 iptables-save > ~/iptables.save 3.恢复iptabl ...
- laravel-v4.0.9
- MVC 应用程序级别捕捉异常
捕捉异常: using System; using System.IO; using System.Net; using System.Net.Http; using System.Net.Http. ...
- Oracle sqlldr导入导出txt数据文件详解
一.sqlldr导入txt 1.预备 a).txt文件 这里要保存成无签名的UTF-8 b).oracle建表 2.编写控制文件input_test.ctl LOAD DATA CHARACTERSE ...
- wampserver2.6下UCenter1.6.0与UCenter Home2.0整合安装
上一篇文章,我们已经安装了,ucenter1.6.0,所以此文介绍独立安装ucenter1.6.0与ucenter home2.0的整合安装. 1,)从官网下载UCenter_Home_2.0_SC_ ...