luan脚本_lua脚本制作工具[通俗易懂]

luan脚本_lua脚本制作工具[通俗易懂]EVAL命令可以直接对输入的脚本进行求值

EVAL命令可以直接对输入的脚本进行求值。

EVALSHA命令可以根据脚本的SHA1校验和来对脚本进行求值,但这个命令要求校验和对应的脚本必须至少被EVAL命令执行过一次。

或者这个校验和对应的脚本曾经被SCRIPT LOAD命令载入过

1. 创建并修改Lua环境

luan脚本_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 伪客户端

luan脚本_lua脚本制作工具[通俗易懂]



2.2 lua_scripts字典

字典的键为某个Lua脚本的SHA1校验和,字典的值则是SHA1校验和对应的Lua脚本


3. EVAL命令的实现

EVAL命令的执行过程可以分为以下三个步骤:
  1. 根据客户端给定的Lua脚本,在Lua环境中定义一个Lua函数
  2. 将客户端给定的脚本保存到lua_scripts字典,等待将来进一步使用
  3. 执行刚刚在Lua环境中定义的函数,以此来执行客户端给定的Lua脚本

3.1 定义脚本函数


Lua函数的名字由f_前缀加上脚本的SHA1校验和组成,而函数体则是脚本本身。


3.2 将脚本保存到lua_scripts字典


3.3 执行脚本函数

luan脚本_lua脚本制作工具[通俗易懂]




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


luan脚本_lua脚本制作工具[通俗易懂]




6. 脚本复制

当服务器运行在复制模式下,具有写性质的脚本命令也会被复制到从服务器,这些命令包括EVAL命令、EVALSHA命令、SCRIPT FLUSH命令以及SCRIPT LOAD命令


6.1 复制EVAL命令、SCRIPT FLUSH命令和SCRIPT LOAD命令

luan脚本_lua脚本制作工具[通俗易懂]






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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注