redis总结-lua脚本

lua说明

Lua是一个高效的轻量级脚本语言(javascript、shell、sql、python、ruby…),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能;

Redis与Lua

Redis中内嵌了对Lua环境的支持,允许开发者使用Lua语言编写脚本传到Redis中执行,Redis客户端可以使用Lua脚本,直接在服务端原子的执行多个Redis命令。

 

使用脚本的好处:

  • 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行
  • 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件
  • 复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑

 

在Lua脚本中调用Redis命令,可以使用redis.call函数调用,通过return 返回结果

比如我们调用string类型的命令

redis.call(‘set’,’hello’,’world’)

redis.call 函数的返回值就是redis命令的执行结果。

redis.call函数会将redis的5种类型的返回值转化对应的Lua的数据类型

样redis会自动将脚本返回值的Lua数据类型转化为Redis的返回值类型。

在脚本中可以使用return 语句将值返回给redis客户端,通过return语句来执行,如果没有执行return,默认返回为nil。

redis的Eval 命令:

使用 Lua 解释器执行脚本

基本语法:
EVAL script numkeys key [key ...] arg [arg ...] 

script: 参数是一段 Lua  脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。
numkeys: 用于指定键名参数的个数。
key [key ...]: 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
arg [arg ...]: 附加参数,在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。

 

示例:

eval "return redis.call('del',unpack(redis.call('keys','chedui_a_*')))" 0

遍历执行:

eval "local ks =redis.call('keys','chedui_a_*') for i=1,#ks do local val = redis.call('GET', ks[i]) redis.call('set',ks[i],'3333') end return 'ok'" 0

指定附加参数

eval "return redis.call('del',unpack(redis.call('keys',ARGV[1])))" 0 site_msg_888*

指定键名参数

eval "local redisKeys = redis.call('keys',KEYS[1]..'*');for i,k in pairs(redisKeys) do redis.call('del',k);end;return redisKeys;" 1 xgss

同时指定键名参数和附加参数

 eval "for i=1,KEYS[1],1 do local k=KEYS[2]..i; redis.call('set',k,ARGV[1]);if ARGV[2] then redis.call('expire',k,ARGV[2]) end;end;return redis.call('keys',KEYS[2]..'*');" 2 10 test 0 20

获取所有值为0,并以test为前缀的key列表,参数:2、x、y
 eval "local ks = {};for i,k in pairs(redis.call('keys',KEYS[1]..'*')) do local v = redis.call('get',k);if v==ARGV[1] then table.insert(ks,k); end;end;return ks;" 1 test 0

posted @ 2023-01-03 10:05  星光闪闪  阅读(263)  评论(0)    收藏  举报