使用
基本语法
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] ,诸如此类)
例子
addup:0>eval "return {KEYS[1],KEYS[2],KEYS[3],ARGV[1],ARGV[2],ARGV[3]}" 3 username age sex kong 24 男
1) "username"
2) "age"
3) "sex"
4) "kong"
5) "24"
6) "男"
addup:0>eval "return KEYS[2]" 2 kong1 kong2
"kong2"
使用redis.call()去调用redis的命令
-- 插入key:name value:kong的键值对,并get
addup:0>eval "return {redis.call('set',KEYS[1],ARGV[1]),redis.call('get',KEYS[2])}" 2 name name kong
1) "OK"
2) "kong"
-- 在上面的基础上再设置过期时间
addup:0>eval "return {redis.call('set',KEYS[1],ARGV[1]),redis.call('expire',KEYS[2],ARGV[2])}" 2 name name kong 12
1) "OK"
2) "1"
addup:0>ttl name
"2"
将脚本缓存起来,不执行。SCRIPT LOAD script
执行缓存的脚本。EVALSHA sha1 numkeys key [key …] arg [arg …]
判断脚本是否已经被缓存。
SCRIPT EXISTS
清空所有脚本缓存。使用SCRIPT FLUSH
杀死当前正在运行的 Lua 脚本。SCRIPT KILL
addup:0>script load "redis.call('set',KEYS[1],ARGV[1]);redis.call('expire',KEYS[1],ARGV[2]);return 1;"
"b53db7fdd933555fba818bbdb07d30d0701b3fad"
addup:0>evalsha b53db7fdd933555fba818bbdb07d30d0701b3fad 1 name kong 60
"1"
addup:0>get name
"kong"
addup:0>ttl name
"51"
addup:0>SCRIPT EXISTS b53db7fdd933555fba818bbdb07d30d0701b3fad
1) "1"
addup:0>SCRIPT FLUSH
"OK"
addup:0>SCRIPT EXISTS b53db7fdd933555fba818bbdb07d30d0701b3fad
1) "0"
执行Lua脚本
--执行的.lua脚本文件
local key = KEYS[1]
local val = redis.call('get', key);
if val == ARGV[1]
then
redis.call('set', KEYS[1], ARGV[2])
return 1
else
return 0
end
addup:0>set name kong
"OK"
addup:0>get name
"kong"
addup:0>ttl name
"-1"
cmd执行脚本
C:\Users\卑已自牧也>d:
D:\>cd Redis
D:\Redis>redis-cli.exe --eval D:\code\test.lua name , kong lalalala
(integer) 1
验证
addup:0>get name
"lalalala"
挖个坑
SpringBoot集成Redis调用Lua脚本
后续补充...