但使书种多,会有岁稔时。这篇文章主要讲述Redis lua环境相关的知识,希望能为你提供帮助。
Redis lua环境redis内嵌lua环境来执行lua脚本:
- 创建了一个lua环境
- 载入函数库
- 创建全局的redis表格,表格里包含redis.call和redis.pcall等函数,通过redis.call可以执行redis命令
- redis使用自己的随机函数替代lua原有的随机函数
- redis服务器创建排序辅助函数保证命令执行结果相同
- 创建redis.pcall函数,当命令执行错误的时候打印出具体的行数
- 保护lua的全局环境
- redisSever的lua属性设置为lua环境
管理脚本的命令
evaleval命令是给客户端输入的脚本在lua环境中定义一个函数,通过调用这个函数来执行脚本。
evalshaevalsha是通过脚本在lua环境中定义的函数名来调用函数执行脚本,函数名是f_40位SHA1校验码,lua_scriptes字典中键为lua脚本的SHA1校验和,值为SHA1校验和对应的lua脚本
script flushscript flush命令是用来清除服务器中所有的lua脚本信息,关闭现有的lua环境重新建一个新的lua环境
script existsscript exists命令是根据校验和查看脚本是否存在
script loadscript load命令和eval一样,加载脚本到lua_scriptes字典中
script killscript kill命令是用来让服务器停止执行这个脚本,并发送错误回复
总结
在主从情况下,脚本的复制,eval命令 script flush命令script load命令都可以直接复制,将命令传播给从服务器
【Redis lua环境】evalsha命令不能直接复制,因为从服务的lua_scriptes字典中可能不存在,而repl_scriptcache_dict字典记录主服务器将哪些脚本传播给从服务器,repl_scriptcache_dict字典的键是sha1校验码,值是null,字典中有这个脚本的校验码说明已经向所有从服务器传播这个脚本,就可以执行evalsha命令,如果不在这个字典中,主服务会将evalsha命令转为EVAL命令,然后传播EVAL命令,再把sha1添加到repl_scriptcache_dict字典中。
推荐阅读
- 搭建组件库最小原型(支线)
- [ 链表OJ题--C语言实现 ] 复制带随机指针的链表(带视频讲解哦)
- kettle庖丁解牛第32篇之本地和上游数据量比较后再抽取
- 路由基础之OSPFRouterID及DR和BDR的选举
- NAT网络地址转换
- 基础网络配置
- Docker下的Spring Cloud三部曲之二(细说Spring Cloud开发)
- Flutter 专题109 图解自定义 ACERadio 单选框 #yyds干货盘点#
- Docker容器实战六(构建定制化镜像)