redis使用lua脚本实现原子性操作案例

参考链接

Redis使用lua脚本

示例代码

if redis.call('EXISTS', KEYS[1]) == 1 then
    redis.call('INCR', KEYS[1])
else
    redis.call('SET', KEYS[1], 1)
    redis.call('EXPIRE', KEYS[1], ARGV[1])
end

return redis.call('GET', KEYS[1])

在lua脚本里面调用redis命令就是使用redis.call('INCR', KEYS[1]),第一个参数是redis的命令,后面的参数是命令后面的参数值。

redis里面的命令是这样

127.0.0.1:6379[11]> set age 12
OK
127.0.0.1:6379[11]>

那么在lua脚本里面就是这样写,后面的0表示要操作的KEY的个数,关于redis使用lua脚本怎么传参数可以看上面的那个连接。

127.0.0.1:6379[11]> EVAL "return redis.call('SET', 'age',18)" 0
OK
127.0.0.1:6379[11]> get age
"18"

自己写的例子在命令行执行

127.0.0.1:6379[11]>  EVAL "if redis.call('EXISTS',KEYS[1]) == 1 then redis.call('INCR',KEYS[1]) else redis.call('TTL',KEYS[1],ARGV[1]) end return redis.call('GET',KEYS[1])" 1 name 2500
"103"
127.0.0.1:6379[11]> ttl name
脚本后面的1表示KEYS的个数,这里写的是1,所以name就是KEYS里面的值,后面的2500就是ARGV里面的值,redis的lua脚本根据脚本后面的第一个参数确定你传入的参数怎么划分KEYS和ARGV。

redis lua脚本命令格式:

EVAL script numkeys key [key ...] arg [arg ...]
说明:
  1. script是第一个参数,也就是lua脚本。
  2. 第二个参数numkeys指定后续参数有几个key。
  3. key [key…],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取
  4. arg [arg…],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。

在命令行里面执行lua脚本

127.0.0.1:6379> eval "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;" 1 test 10 60
(integer) 1

使用redis-cli命令执行脚本

格式

redis-cli --eval lua_file key1 key2 , arg1 arg2 arg3

注意事项

  • eval 后面参数是lua脚本文件.lua后缀
  • 不用写numkeys,而是使用,隔开。前后需要空格。

两种执行脚本的方式传参的方式稍微有点不一样,其他的都一样。
如果使用redis-cli需要在脚本里面选择redis的库。要是在命令行里面就可以先选择库(如:redis.call('select',11)),在执行命令,一般我们在使用的时候都是使用封装好的redis客户端,直接选择好 redis的库了。

lua的基本语法可以查看菜鸟教程。

你可能感兴趣的:(linux,redis的lua脚本原子性)