前言
本文实现中使用的evalsha执行的lua,所以先描述下redis中eval和evalsha使用区别
eval
基本语法如下:
redis 127.0.0.1:6379> EVAL script numkeys key [key …] arg [arg …]
参数说明:
script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
numkeys: 用于指定键名参数的个数。
key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。## evalsha
先要执行scriptLoad把脚本加载到redis缓存中,再使用evalsha来执行
「Redis Evalsha 命令根据给定的 sha1 校验码,执行缓存在服务器中的脚本」
EVALSHA
基本语法如下:
EVALSHA sha1 numkeys key [key …] arg [arg …]
参数说明:
sha1 : 通过 SCRIPT LOAD 生成的 sha1 校验码。
numkeys: 用于指定键名参数的个数。
key [key …]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg …]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
两者的差异
eval直接执行上传的脚本不从缓存拿
evalsha直接从缓存中取sha中脚本信息执行