Redis与Lua脚本

本文详细介绍了如何在Redis中使用EVAL命令执行Lua脚本,包括设置键值对、设置过期时间、缓存及执行脚本的方法,并展示了通过SCRIPTLOAD和EVALSHA进行脚本缓存和执行的流程。此外,还演示了使用lua脚本进行条件判断和操作的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用

基本语法

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脚本

后续补充...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值