| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 重点回顾【Redis设计与实现】第四部分 独立功能的实现 -> 正文阅读 |
|
[大数据]重点回顾【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 链表,将相关信息发送给监视器。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 13:49:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |