《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:将客户端设置为监视器,可以收到服务器当前处理的命令相关信息。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值