Redis lua环境

但使书种多,会有岁稔时。这篇文章主要讲述Redis lua环境相关的知识,希望能为你提供帮助。
Redis lua环境redis内嵌lua环境来执行lua脚本:

  1. 创建了一个lua环境
  2. 载入函数库
  3. 创建全局的redis表格,表格里包含redis.call和redis.pcall等函数,通过redis.call可以执行redis命令
  4. redis使用自己的随机函数替代lua原有的随机函数
  5. redis服务器创建排序辅助函数保证命令执行结果相同
  6. 创建redis.pcall函数,当命令执行错误的时候打印出具体的行数
  7. 保护lua的全局环境
  8. redisSever的lua属性设置为lua环境
命令的执行过程lua环境先通过redis.call函数传送redis命令给伪客户端,伪客户端将脚本想要执行的命令传给命令执行器,命令执行器执行命令后返给结果给伪客户端,然后伪客户端返回lua环境,然后lua环境将结果返回给redis.call函数
管理脚本的命令
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字典中。

    推荐阅读