Redis(六)Script

从Redis 2.6.0版本开始,引入了EVAL和EVALSHA命令用于执行Lua脚本,提供了一种在服务器端进行复杂操作的方式。EVAL命令格式为:EVAL script numkeys key[key...] arg[arg...]。Lua脚本可通过redis.call()和redis.pcall()调用Redis命令,且Redis确保EVAL执行的脚本具有原子性。

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

Redis从2.6.0开始,可以使用命令EVALEVALSHA执行Lua脚本。
脚本命令

     EVAL script numkeys key [key ...] arg [arg ...] 

比如

   EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}" 2 key1 key2 a1 a2 a3
  • 双引号"…"的内容就是Lua脚本,
  • 2就是key的数量,指后面key1, key2,剩下a1, a2, a3就可以用ARGV[n]来表示
    注意
    Lua中索引从1开始,所以第1个是KEYS[1]或ARGV[1],KEYS和ARGV是Lua的全局变量在脚本中可以直接使用
    上面的命令会返回
1) "key1"
2) "key2"
3) "a1"
4) "a2"
5) "a3"

如果EVAL中的脚本要执行Redis命令,可以使用

  • redis.call()
  • redis.pcall()

比如需要在脚本中执行Redis命令

>EVAL "return redis.call('set', 'foo', 'value1')" 0
OK

在Redis中脚本使用的规则,如果脚本中如果执行Redis命令,像上面设置key foo值为value value1,则是建议把key放在EVAL命令的key中传进去,像这样

>EVAL "return redis.call('set', KEYS[1], 'value1')" 1 foo
OK

这样的好处是,Redis可以根据foo判断key是在集群中不同的节点去执行。

原子性

Redis对EVAL执行脚本是保证原子性的,这跟MULTI / EXEC是相似的,这就意味着脚本没执行完之前,其他客户端的命令或者脚本都是不能执行的,不过,脚本也不是没缺点的,如果脚本里产生死循环或其他情况,那将是致命的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值