《Redis设计与实现》4.独立功能的实现
一、发布与订阅
通过PUBLISH发布、SUBSCRIBE订阅、PSUBSCRIBE模式订阅组成。
1.频道订阅与退订
-
虚线为新增订阅,如果channel已经存在,则直接添加到对应链表尾端,如果不存在,则现在pubsub_channels中添加新channel,然后添加节点。
-
与订阅相反,退订时如果去掉该客户端节点后,channel没有其他订阅者,则将该channel从pubsub_channels中删除。
2.模式订阅与退订
在redisServer中存在一个链表pubsub_patterns,存放模式订阅,如下图
-
订阅时,生成一个pubsubPattern结构,包含模式pattern与客户端client,将该节点添加到pubsub_patterns链表的尾部
-
退订时,从链表中删除节点
3.发布消息:从pubsub_channels中找出对应的channel订阅链表,发送消息;找出pubsub_patterns中匹配的模式,发送消息。
二、事务
1.通过MULTI、EXEC、WATCH实现
-
MULTI:开启事务,标记客户端为事务状态。客户端在非事务状态时,命令会立即执行;当在事务状态时,EXEC、DISCARD、WATCH、MULTI会被立即执行,而其他命令则会放入事务队列,并返回QUEUED。
-
事务队列:FIFO队列,将命令封装成multiCmd,包含参数argv、参数个数argc、命令指针cmd。
-
EXEC:服务器收到EXEC,执行事务队列命令,并将客户端恢复到非事务状态,返回执行结果。
-
WATCH:是一个乐观锁,执行EXEC时判断监视的key是否被修改过,修改过则拒绝执行。通过修改客户端的REDIS_DIRTY_CAS标识。watched_keys队列保存了监视的key,以及客户端列表。
2.事务的ACID
-
原子性:要么都执行,要么都不执行,不存在回滚。
-
一致性:一致性是指符合数据库本身的定义和要求,不存在非法或者无效的错误数据。入队错误拒绝执行事务;执行错误不中断,继续执行之后命令;服务器停机AOF、RDB恢复。
-
隔离性:redis单线程,符合隔离性。
-
持久性:内存模式,不具备持久性;RDB模式,会丢失部分数据,不具备持久性;AOF模式下,appendfsync设置为always时,具备持久性;AOF模式appendfsync设置为everysec或no,会丢失部分数据,不具备持久性。
-
no-appendfsync-on-rewrite设置为no,在做bgrewriteaof时,正常的AOF操作不会停止,会产生I/O阻塞;设置为yes时,正常的AOF只会写入缓冲区,从而不会产生I/O阻塞,但同时也不具有耐久性。
三、Lua脚本
四、排序
五、二进制位图
六、慢查询日志
slowlog-log0-shower-than:指定实行时间超过多少微秒的命令记录到日志。
slowlog-max-len:最多记录多少条慢查询日志。
SHOWLOG_GET:查看慢查询日志。
SHOWLOG_RESET:重置慢查询日志。
七、监视器
MONITOR:将客户端设置为监视器,可以收到服务器当前处理的命令相关信息。