lua redis执行lua脚本
redis使用命令行、redis-cli客户端、redisTemplate执行lua脚本
命令行、客户端执行脚本
语法格式
# 直接执行脚本(redis-cli客户端执行)
eval lua-script key-num [key key2 key3 ...] [value value2 value3 ...]
# 缓存脚本后执行(命令行执行,没有进入客户端)
redis-cli --eval --lua-script [key key2 ...] , [value value2 ...]
* key与value用逗号间隔,且逗号前后有空格)
lua 调用redis命令
redis.call(command, KEYS[1], KEYS[2], ... , ARGV[1], ARGV[2], ...)
# 命令说明
KEYS[1]:第一个key
ARGV[1]:第一个value
KEYS、ARGV不需要一一对应,个数不需要相等
# 示例
redis.call('set', KEYS[1], ARGV[1])
redis.call('get', KEYS[1])
示例:redis-cli客户端执行脚本
huli@hudeMacBook-Pro ~ % docker exec -it redis2 bash
-- redis-cli客户端
root@0d79dbff702e:/data# redis-cli
-- KEYS、ARGV名称是固定的,不能随便设置
127.0.0.1:6379> eval "redis.call('set',key[1],arg[1])" 1 set 瓜田李下
(error) ERR Error running script (call to f_c7f25ef16dd21c6a4dc44cf3964041227459f25e): @enable_strict_lua:15: user_script:1: Script attempted to access nonexistent global variable 'key'
-- set key=瓜田李下
127.0.0.1:6379> eval "redis.call('set',KEYS[1],ARGV[1])" 1 key 瓜田李下
(nil)
-- 获取key:没有return,无返回值
127.0.0.1:6379> eval "redis.call('get',KEYS[1])" 1 key
(nil)
-- 调用return,返回key对用的value(瓜田李下)
-- 由于是中文,redis存储的时候进行了序列化
127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 key
"\xe7\x93\x9c\xe7\x94\xb0\xe6\x9d\x8e\xe4\xb8\x8b"
-- 设置key