目录前言1. lua 脚本1.1 Redis 创建并修改 Lua 环境的步骤1.2 Lua 环境协作组件1.3 EVAL 命令的实现1.4 EVALSHA 命令的实现1.5 脚本管理命令的实现1.6 脚本复制1.6.1 EVAL、SCRI
参考资料:《Redis设计与实现 第二版》;
第三部分为独立功能的实现,主要由以下模块组成:发布订阅、事务、Lua 脚本、排序、二进制位数组、慢查询日志、监视器;
本篇将介绍 Redis 的Lua 脚本与排序。Redis 从 2.6 版本开始可以使用一些命令操作 Lua 脚本,引入相关支持;Redis 的 SORT 命令可以对列表键、集合键或者有序集合键的值进行排序,SORT 命令的一些可选性能让我们得到想要的排序;
与本章相关的 Redis 命令总结在下篇文章,欢迎点击收藏,本篇将不再重复:
《Redis常用命令及示例总结(API)》:https://www.cnblogs.com/dlhjw/p/15639773.html
redis.call
和 redis.pcall
函数等;math.random
和 math.randomseed
函数带有副作用,Redis 对其进行了替换,以避免在脚本中引入副作用;redis__compare_helper
排列辅助函数;__redis__err__handler
错误处理函数,提供更详细的出错信息;Redis 服务器创建两个与 Lua 环境进行协作的组件;
伪客户端:
lua_scripts 字典:
struct redisServer{
//...
//字典,键为某个 Lua 脚本的 SHA1 校验和,值为 SHA1 校验和对应的 Lua 脚本
dict *lua_scripts;
}
lua_scripts
字典里;EVAL "return "hello world"" 0
,实现步骤如下:f_SHA1的校验和
,函数体为脚本本身return "hello world"
;f_SHA1的校验和
;lua_scripts
字典,关闭现有 Lua 环境并重建一个新的 Lua 环境;lua_scripts
字典的键,判断对应的脚本是否存在服务器中;lua_scripts
字典;判断传播 EVALSHA 命令是否安全的方法:主服务器使用 repl_scriptcache_dict
字典记录哪些脚本传播给了所有从服务器。跟 lua_scripts
字典对比即可得知哪些校验和还未传播;
struct redisServer{
//...
//字典,键是校验和 SHA1,值是 NULL
dict *repl_scriptcache_dict;
};
清空 repl_scriptcache_dict 字典:每当主服务器添加一个新的从服务器时,主服务器会清空自己的 repl_scriptcache_dict
字典;
EVALSHA 命令转换成 EVAL 命令的方法:根据 sha1 校验和在 lua_scripts
字典中查找对应 Lua脚本 script;然后改写命令,用 script 替换 sha1;其他参数不变;
EVAL script numkeys key [key ...] arg [arg ...]
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
传播 EVALSHA 命令的方法:当主服务器成功执行完一个 EVALSHA 命令后,会根据该命令指定的 SHA1 校验和是否存在于 repl_scriptcache_dict
字典里来决定是否向从服务器传播 EVALSHA 命令还是 EVAL 命令;
redis.h/redisSortObject
结构;u.score
属性里;u.score
属性的值,对数组进行数字值排序;--结束END--
本文标题: Redis | 第9章 Lua 脚本与排序《Redis设计与实现》
本文链接: https://www.lsjlt.com/news/8985.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-14
2024-05-14
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0