Redis lua环境

Posted 周杰伦本人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数

管理脚本的命令

eval

eval命令是给客户端输入的脚本在lua环境中定义一个函数,通过调用这个函数来执行脚本。

evalsha

evalsha是通过脚本在lua环境中定义的函数名来调用函数执行脚本,函数名是f_40位SHA1校验码,lua_scriptes字典中键为lua脚本的SHA1校验和,值为SHA1校验和对应的lua脚本

script flush

script flush命令是用来清除服务器中所有的lua脚本信息,关闭现有的lua环境重新建一个新的lua环境

script exists

script exists命令是根据校验和查看脚本是否存在

script load

script load命令和eval一样,加载脚本到lua_scriptes字典中

script kill

script kill命令是用来让服务器停止执行这个脚本,并发送错误回复

总结

在主从情况下,脚本的复制,eval命令 script flush命令script load命令都可以直接复制,将命令传播给从服务器

evalsha命令不能直接复制,因为从服务的lua_scriptes字典中可能不存在,而repl_scriptcache_dict字典记录主服务器将哪些脚本传播给从服务器,repl_scriptcache_dict字典的键是sha1校验码,值是null,字典中有这个脚本的校验码说明已经向所有从服务器传播这个脚本,就可以执行evalsha命令,如果不在这个字典中,主服务会将evalsha命令转为EVAL命令,然后传播EVAL命令,再把sha1添加到repl_scriptcache_dict字典中。

以上是关于Redis lua环境的主要内容,如果未能解决你的问题,请参考以下文章

非openresty方式安装Nginx + Lua + Redis 环境

redis在使用lua脚本以及实现redis分布式锁

Redis | 第9章 Lua 脚本与排序《Redis设计与实现》

nginx中使用lua操作redis数据库

redis使用lua脚本

redis使用lua脚本