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

浙公网安备 33010602011771号