EVAL命令可以直接对输入的脚本进行求值。
EVALSHA命令可以根据脚本的SHA1校验和来对脚本进行求值,但这个命令要求校验和对应的脚本必须至少被EVAL命令执行过一次。
或者这个校验和对应的脚本曾经被SCRIPT LOAD命令载入过
1. 创建并修改Lua环境
1.1 创建Lua环境
lua_open
1.2 载入函数库
- 基础库(base library):包含Lua的核心函数
- 表格库(table library):用于处理表格的通用函数
- 字符串库(string library):用于处理字符串的通用函数
- 数学库(math library):标准C语言数学库的接口
- 调试库(debug library):提供了对程序进行调试所需的函数
- Lua CJSON库:处理UTF-8编码的JSON格式
- Struct库:用于在Lua值和C结构之间进行转换
- Lua cmsgpack 库:用于处理MessagePack格式的数据,其中cmsgpack.pack 将Lua值转换为MessagePack数据
1.3 创建redis全局表格
服务器在Lua环境中创建一个redis表格,并将它设为全局变量,包含以下函数:
- 用于执行Redis命令的redis.call和redis.pcall
- 用于计算Redis日志的redis.log函数,以及相应的日志级别常量
- 用于计算SHA1校验和的redis.shalhex函数
- 用于返回错误信息的redis.error_reply函数和redis.status_reply函数
1.4 使用Redis自制的随机数函数来替换Lua原有的随机数
1.5 创建排序辅助函数
__redis__compare_helper,当Lua脚本执行完一个带有不确定性的命令之后,程序会使用这个函数作为比较函数,自动调用table.sort函数对命令的返回值做一次排序
1.6 创建redis.pcall函数的错误报告辅助函数
__redis__err__handler错误处理函数
1.7 保护Lua的全局环境
1.8 将Lua环境保存到服务器状态的lua属性里面
2. Lua环境协作组件
2.1 伪客户端
2.2 lua_scripts字典
字典的键为某个Lua脚本的SHA1校验和,字典的值则是SHA1校验和对应的Lua脚本
3. EVAL命令的实现
EVAL命令的执行过程可以分为以下三个步骤:
- 根据客户端给定的Lua脚本,在Lua环境中定义一个Lua函数
- 将客户端给定的脚本保存到lua_scripts字典,等待将来进一步使用
- 执行刚刚在Lua环境中定义的函数,以此来执行客户端给定的Lua脚本
3.1 定义脚本函数
Lua函数的名字由f_前缀加上脚本的SHA1校验和组成,而函数体则是脚本本身。
3.2 将脚本保存到lua_scripts字典
3.3 执行脚本函数
4.EVALSHA命令的实现
客户端根据脚本的SHA1校验和来调用脚本对应的函数,从而达到执行脚本的目的
5. 脚本管理命令的实现
5.1 SCRIPT FLUSH
用于清除服务器中所有和Lua脚本有关的信息,这个命令会释放并重建lua_scripts字典,关闭现有的Lua环境并重新创建一个新的Lua环境
5.2 SCRIPT EXISTS
根据输入的SHA1校验和,检查校验和对应的脚本是否存在于服务器中
5. 3 SCRIPT LOAD
与EVAL命令前两步完全一样:在Lua环境中为脚本创建相对应的函数,然后再将脚本保存到lua_scripts字典里面。
5.4 SCRIPT KILL
6. 脚本复制
当服务器运行在复制模式下,具有写性质的脚本命令也会被复制到从服务器,这些命令包括EVAL命令、EVALSHA命令、SCRIPT FLUSH命令以及SCRIPT LOAD命令
6.1 复制EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令
6.2 复制EVALSHA命令
1. 判断传播EVAlSHA命令是否按去哪的方法
主服务器使用服务器状态的repl_scriptcatche_dict字典记录自己已经将那些脚本传播给所有从服务器
2.清空repl_scriptcache_dict字典
每当主服务器添加一个新的从服务器时,主服务器都会清空自己的repl_scriptcache_dict字典
3. EVALSHA命令转换成EVAl命令的方法
4.传播EVALSHA命令的方法
今天的文章luan脚本_lua脚本制作工具[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69741.html