重点回顾【Redis设计与实现】第四部分 独立功能的实现

十八、发布与订阅

🟢 服务器状态在 pubsub_channels 字典保存了所有频道的订阅关系:SUBSCRIBE 命令负责将客户端和被订阅的频道关联到这个字典里面,而 UNSUBSCRIBE 命令则负责解除客户端和被退订频道之间的关联。

🟢 服务器状态在 pubsub_patterns 链表保存了所有模式的订阅关系:PSUBSCRIBE 命令负责将客户端和被订阅的模式记录到这个链表中,而 PUNSUBSCRIBE 命令则负责移除客户端和被退订模式在链表中的记录。

🟢 PUBLISH 命令通过访问 pubsub_channels 字典来向频道的所有订阅者发送消息,通过访问 pubsub_patterns 链表来向所有匹配频道的模式的订阅者发送消息。

🟢 PUBSUB 命令的三个子命令都是通过读取 pubsub_channels 字典和 pubsub_patterns 链表中的信息来实现的。

十九、事务

🟢 事务提供了一种将多个命令打包,然后一次性、有序地执行的机制。

🟢 多个命令才会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行。

🟢 事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。

🟢 带有 WATCH 命令的事务会将客户端和被监视的键在数据库中的 watched_keys 字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端的 REDIS_DIRTY_CAS 标志打开。

🟢 只有在客户端的 REDIS_DIRTY_CAS 标志未被打开时,服务器才会执行客户端提交的事务,否则的话,服务器将拒绝执行客户端提交的事务。

🟢 Redis 的事务总是具有 ACID 中的原子性、一致性和隔离性,当服务器运行在 AOF 持久化模式下,并且 appendfsync 选项的值为 always 时,事务也具有耐久性。

二十、Lua脚本

🟢 Redis 服务器在启动时,会对内嵌的 Lua 环境执行一系列修改操作,从而确保内嵌的 Lua 环境可以满足 Redis 在功能性、安全性等方面的需要。

🟢 Redis 服务器专门使用一个伪客户端来执行 Lua 脚本中包含的 Redis 命令。

🟢 Redis 使用脚本字典来保存所有被 EVAL 命令执行过,或者被 SCRIPT LOAD 命令载入过的 Lua 脚本,这些脚本可以用于实现 SCRIPT EXISTS 命令,以及实现脚本复制功能。

🟢 EVAL 命令为客户端输入的脚本在 Lua 环境中定义一个函数,并通过调用这个函数来执行脚本。

🟢 EVALSHA 命令通过直接调用 Lua 环境中已定义的函数来执行脚本。

🟢 SCRIPT FLUSH 命令会清空服务器 lua_scripts 字典中保存的脚本,并重置 Lua 环境。

🟢 SCRIPT EXISTS 命令接受一个或多个 SHA1 校验和为参数,并通过检查 lua_scripts 字典来确认校验和对应的脚本是否存在。

🟢 SCRIPT LOAD 命令接受一个 Lua 脚本为参数,为该脚本在 Lua 环境中创建函数,并将脚本保存到 lua_scripts 字典中。

🟢 服务器在执行脚本之前,会为 Lua 环境设置一个超时处理钩子,当脚本出现超时运行情况时,客户端可以通过向服务器发送 SCRIPT KILL 命令来让钩子停止正在执行的脚本,或者发送 SHUTDOWN nosave 命令来让钩子关闭整个服务器。

🟢 主服务器复制 EVAL、SCRIPT FLIUSH、SCRIPT LOAD 三个命令的方法和复制普通 Redis 命令一样,只要将相同的命令传播给从服务器就可以了。

🟢 主服务器在复制 EVALSHA 命令时,必须确保所有从服务器都已经载入了 EVALSHA 命令指定的 SHA1校验和所对应的 Lua 脚本,如果不能确保这一点的话,主服务器回将 EVALSHA 命令转换成等效的 EVAL 命令,并通过传播 EVAL 命令来获得相同的脚本来执行效果。

二十一、排序

🟢 SORT 命令通过将被排序键包含的元素载入到数组里面,然后对数组进行排序来完成对键进行排序的工作。

🟢 在默认情况下,SORT 命令假设被排序键包含的都是数字值,并且以数字值的方式来进行排序。

🟢 如果 SORT 命令使用了 ALPHA 选项,那么 SORT 命令假设被排序键包含的都是字符串值,并且以字符串的方式来进行排序。

🟢 SORT 命令的排序操作由快速排序算法实现。

🟢 SORT 命令会根据用户是否使用了 DESC 选项来决定是使用升序对比还是降序对比来比较被排序的元素,升序对比会产生升序排序结果,被排序的元素按值的大小从小到大排列,降序对比会产生降序排序结果,被排序的元素按值的大小从大到小排列。

🟢 当 SORT 命令使用了 BY 选项时,命令使用其他键的值作为权重来进行排序操作。

🟢 当 SORT 命令使用了 LIMIT 选项时,命令只保留排序结果中 LIMIT 选项指定的元素。

🟢 当 SORT 命令使用了 GET 选项时,命令会根据排序结果集中的元素,以及 GET 选项给定的模式,查找并返回其他键的值,而不是返回被排序的元素。

🟢 当 SORT 命令使用了 STORE 选项时,命令会将排序结果集保存在指定的键里面。

🟢 当 SORT 命令同时使用多个选项时,命令先执行排序操作(可用的选项为 ALPHA、ASC或DESC、BY),然后执行 LIMIT 选项,之后执行 GET 选项,再之后执行 STORE 选项,最后才将排序结果集返回给客户端。

🟢 除了 GET 选项之外,调整选项的摆放位置不会影响 SORT 命令的排序结果。

二十二、二进制位数组

🟢 Redis 使用 SDS 来保存位数组。

🟢 SDS 使用逆序来保存位数组,这种保存顺序简化了 SETBIT 命令的实现,使得 SETBIT 命令可以在不移动现有二进制位的情况下,对位数组进行空间扩展。

🟢 BITCOUNT 命令使用了查表算法和 variable-precision SWAR 算法来优化命令的执行效率。

🟢 BITOP 命令的所有操作都使用 C 语言内置的位操作来实现。

二十三、慢查询日志

🟢 Redis 的慢查询日志功能用于记录执行时间超过指定时长的命令。

🟢 Redis 服务器将所有的慢查询日志保存在服务器状态的 slowlog 链表中,每个链表节点都包含一个 slowlogEntry 结构,每个 slowlogEntry 结构代表一条慢查询日志。

🟢 打印和删除慢查询日志可以通过遍历 slowlog 链表来完成。

🟢 slowlog 链表的长度就是服务器所保存慢查询日志的数量。

🟢 新的慢查询日志会被添加到 slowlog 链表的表头,如果日志的数量超过 slowlog-max-len 选项的值,那么多出来的日志会被删除。

二十四、监视器

🟢 客户端可以通过执行 MONITOR 命令,将客户端转换成监视器,接收并打印服务器处理的每个命令请求的相关信息。

🟢 当一个客户端从普通客户端变成监视器时,该客户端的 REDIS-MONITOR 标识会被打开。

🟢 服务器所有监视器都记录在 monitors 链表中。

🟢 每次处理命令请求时,服务器都会遍历 monitors 链表,将相关信息发送给监视器。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值