Redis | 第9章 Lua 脚本与排序《Redis设计与实现

2021-12-04  本文已影响0人  多氯环己烷

前言

参考资料:《Redis设计与实现 第二版》;

第三部分为独立功能的实现,主要由以下模块组成:发布订阅事务Lua 脚本排序二进制位数组慢查询日志监视器

本篇将介绍 Redis 的Lua 脚本排序。Redis 从 2.6 版本开始可以使用一些命令操作 Lua 脚本,引入相关支持;Redis 的 SORT 命令可以对列表键、集合键或者有序集合键的值进行排序,SORT 命令的一些可选性能让我们得到想要的排序;

与本章相关的 Redis 命令总结在下篇文章,欢迎点击收藏,本篇将不再重复:

《Redis常用命令及示例总结(API)》https://www.jianshu.com/p/f8eb9afaa908


1. Lua 脚本

1.1 Redis 创建并修改 Lua 环境的步骤

  1. 创建 Lua 环境:调用 Lua 的 C API 函数 lua_open;
  2. 载入函数库:包括基础库、表格库、字符串库、数学库、调试库、Lua CJSON 库、Struct 库、Lua cmsgpack 库等;
  3. 创建 redis 全局表格:表格包含对 Redis 进行操作的函数,如 redis.callredis.pcall 函数等;
  4. 使用 Redis 自制的随机函数替换 Lua 原有的随机函数math.randommath.randomseed 函数带有副作用,Redis 对其进行了替换,以避免在脚本中引入副作用;
  5. 创建排序辅助函数:有些命令在相同数据集上会产生不同结果,为了消除这些命令带来的不确定性,创建了 redis__compare_helper 排列辅助函数;
  6. 创建 redis.pcall 函数的错误报告辅助函数:创建 __redis__err__handler 错误处理函数,提供更详细的出错信息;
  7. 保护 Lua 全局环境:防止用户在执行脚本时将额外的全局变量添加到 Lua 环境中,但可以修改已存在的全局变量;
  8. 将 Lua 环境保存到服务器状态的 lua 属性里:然后等待服务器传来 lua 脚本;
保存 lua 环境.png

1.2 Lua 环境协作组件

1.3 EVAL 命令的实现

  1. 定义脚本函数:给函数命令为 f_SHA1的校验和,函数体为脚本本身return 'hello world'
  2. 将脚本保存到 lua_scripts 字典
添加键值对后的 lua_scripts 字典.png
  1. 执行脚本函数:先进行设置钩子(hook)、传入参数等准备工作,再执行函数,将执行结果保存到客户端状态的输出缓冲区,执行垃圾回收等操作;

1.4 EVALSHA 命令的实现

1.5 脚本管理命令的实现

SCRIPT KILL命令的钩子情况.png

1.6 脚本复制

1.6.1 EVAL、SCRIPT FLUSH、SCRIPTLOAD 命令的复制

1.6.2 EVALSHA 命令的复制

传播 EVALSHA 命令的方法.png

2. 排序

2.1 SORT <key> 命令的实现

设置数组的 u.score 属性.png

2.2 SORT 命令的可选项

2.3 多个选项的执行顺序


最后

\color{blue}{\rm\small{新人制作,如有错误,欢迎指出,感激不尽!}}

\color{blue}{\rm\small{欢迎关注我,并与我交流!}}

\color{blue}{\rm\small{如需转载,请标注出处!}}

上一篇 下一篇

猜你喜欢

热点阅读