redis主要的lua脚本命令有:

1. eval: 执行脚本(前面已经介绍过,先封装成f_sha,然后执行)
	1> 封装函数f_sha
	2> 将脚本加入到lua_scripts_dict中
	3> 设置超时钩子
	4> 执行脚本
	5> 移除超时钩子
	6> 返回结果
2. evalsha:根据sha校验和执行脚本
3. script load:加载脚本(eval的前两步)
4. script exists:根据sha判断脚本是否存在
5. script flush:清除原有脚本并创建新的字典(lua_scripts_dict)
6. script kill(shutdown nosave):结束脚本进程
	如果前面没有写操作,则直接script kill
	如果前面有写操作,为了消除写操作的影响,执行shutdown nosave
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

lua脚本执行过程如图:

redis sh脚本 redis 执行脚本_lua执行shell命令6

对于集群中的主从复制,其他的脚本只要主服务器将脚本命令同步到从服务器即可,但是evalsha命令,有些特殊,如果对master没有同步到或还没同步到的从服务器执行evalsha命令,可能会出现不存在的情况,因为对应的f_sha脚本函数还没有同步到从服务器上,
对此设置了一个repl_scriptcache_dict通过sha来记录是否已将该sha对应的函数同步到了所有的从服务器上,如果全部从服务器都同步了,会将对应的sha存储到repl_scriptcache_dict,否则不会存进去,所以可以根据这个来判断lua脚本的同步情况,并且对于没有同步的从服务器,如果找不到sha,则会执行eval命令来代替evalsha,保证命令的顺利执行。