redis通过lua脚本,获取满足key pattern的所有值

本文介绍如何利用Redis的keys命令结合mget命令或Lua脚本,高效批量获取所有匹配模式的Key及其对应的Value,包括使用xargs简化操作及Lua脚本的详细解释。

我们知道,redis提供了keys命令去获取所有满足格式的key,如我们键入命令

keys "user*"

将得到所有以user开头的key
keys *user
然后执行 mget命令可以获取多个key的值,如
在这里插入图片描述
但如果满足条件的key过多,我们要将所有key拿到,再用mget去拿到所有值则为相对比较麻烦,因此可以借助xargs

redis-cli keys "user*"|xargs redis-cli mget获取到所有key的值
在这里插入图片描述
也可以执行lua脚本local keys = redis.call('keys', KEYS[1]); return redis.call('mget',unpack(keys));
在这里插入图片描述
如果需要同时输出key和value,可以调整lua脚本
eval "local keys = redis.call('keys', KEYS[1]); local values = redis.call('mget',unpack(keys)); local keyValuePairs = {};for i = 1, #keys do keyValuePairs[i] = keys[i]..':'..values[i] end; return keyValuePairs;" 1 "user*",
最后输出结果如下
在这里插入图片描述

这里简单普及下redis eval命令 和lua脚本基本用法
eval命令的格式如下
eval script numkeys key1 key2 arg1 arg2
scriptlua脚本,字符串,首尾引号必须,脚本中的双引号全改为单引号即可
numkeyskey的数量,key和arg都是传入lua脚本的参数,下面提到
key1,key2指具体key值,上面的numkeys有多少个,这里的key就有多少个
arg1,arg2key结束后就是arg。
eval "return 'hello'" 3 1 2 3 4 5 6 7中第一个3为key的数量,即后面的123为key,4567为arg。
在脚本中可以用KEYS[2]表式第二个参数,ARGV[2]表示第2个参数值,比如我们修改上面return 'hello'的值
eval "return KEYS[3]" 3 1 2 3 4 5 6 7将返回第3个参数,即3
在这里插入图片描述
eval "return ARGV[2]" 3 1 2 3 4 5 6 7将返回第二个值,即5
在这里插入图片描述
在lua脚本中使用redis.call('get',...)可调用redis命令,我们将上面的lua脚本格式化,解释如下 :
lua中用–表示注释

--local为局部变量,没有local关键字,则视为全局变量
--redis.call是调用redis命令,下面使用了keys命令
--KEYS[1]为第1个参数,lua数组下标从1开始
local keys = redis.call('keys', KEYS[1]);
--下面通过mget获取所有key的值,call后面是可变长参数,unpack是将数组变成可变长参数
local values = redis.call('mget', unpack(keys));
--定义返回结果
local keyValuePairs = {};
--#keys是获取keys的长度,这里作了个for循环,将key与value对应起来
--lua中字符串拼接是用..
for i = 1, #keys do
    keyValuePairs[i] = keys[i] .. '\t' .. values[i]
end;
--返回结果
return keyValuePairs;
### Redis Cluster 模式下 Lua 脚本的使用方法与注意事项 在 Redis Cluster 模式下使用 Lua 脚本时,需要特别注意数据分片和节点间通信的特性。由于 Redis Cluster 将数据分布在多个节点上,Lua 脚本只能在单个节点上执行,无法跨节点操作。因此,编写脚本时必须确保所有操作的键都位于同一个哈希槽中,否则会触发 `CROSSSLOT Keys in request don't hash to the same slot` 错误。 #### 配置与模块支持 在 OpenResty 环境中调用 Redis Cluster 时,需要正确配置 Lua 模块和共享内存区域。例如,需设置 `lua_package_path` 和 `lua_package_cpath` 以加载 Lua 模块,并通过 `lua_shared_dict` 配置共享内存用于缓存 Redis Cluster 的槽位锁信息: ```nginx lua_package_path "/usr/local/openresty/lualib/?.lua;;"; lua_package_cpath "/usr/local/openresty/lualib/?.so;;"; lua_shared_dict redis_cluster_slot_locks 100k; ``` 此配置确保 Lua 脚本可以正确加载 Redis 模块,并在访问 Redis Cluster 时避免并发问题[^1]。 #### Lua 脚本编写注意事项 在 Redis Cluster 中使用 Lua 脚本时,必须确保所有操作的键属于同一个槽位。可以通过 `redis-cli --cluster check` 命令检查键的分布情况。例如,以下脚本用于扫描匹配特定模式的键并获取其内存使用情况: ```lua local cursor = '0' local pattern = 'RISK_SUB:INFO:IND:PARA:*' local result_map = {} repeat local match_keys = redis.call('SCAN', cursor, 'MATCH', pattern, 'COUNT', 100) cursor = match_keys[1] local keys = match_keys[2] for i, key in ipairs(keys) do local size = redis.call('MEMORY', 'USAGE', key) table.insert(result_map, {key, size}) end until cursor == '0' return result_map ``` 该脚本适用于单个节点上的键扫描,若需跨节点操作,需在客户端分片处理,分别对每个节点执行脚本[^2]。 #### 命令兼容性与参数校验 Redis Cluster 中的 Lua 脚本应避免使用 `redis.call/pcall` 调用某些参数校验严格的命令,例如 `PEXPIRE`。若参数数量不匹配,会触发错误如 `ERR bad lua script for redis cluster, redis.call/pcall, wrong number of arguments for ‘pexpire’ command`。因此,在编写脚本时,应仔细检查命令参数格式,确保符合 Redis Cluster 的要求[^4]。 #### 集群节点启动与脚本执行环境 在部署 Redis Cluster 时,需确保所有节点正常启动,并通过 `redis-cli cluster nodes` 或 `ps -ef | grep redis` 检查集群状态。只有在集群稳定运行的前提下,Lua 脚本才能正确执行。例如,以下命令用于启动 Redis Cluster 节点: ```bash redis-server /path/to/redis.conf --cluster-enabled yes --cluster-node-timeout 5000 ``` 确保所有节点配置一致且槽位分配正确,以支持 Lua 脚本的运行环境[^5]。 #### 脚本调试与日志 Redis 提供了 Lua 脚本的调试工具 LDB(Lua DeBugger),支持单步执行、断点、变量查看等功能。在调试模式下,可以使用 `redis-cli --ldb` 连接到 Redis 实例并调试 Lua 脚本,确保其在 Redis Cluster 环境中运行无误。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值