场景
线上生产环境redis库中保存了大量的没有文件层级结构的键值对,这样对于使用redis desktop manager客户端来说所有的key都在同一层级,不便于管理
类似这种
解决思路
匹配20000000前缀的key,获取到key列表
遍历获取每一个key对应的value值
重新set新的key名称和老的value值
落地方案
编写Java程序,借助redisTemplate提供的方法,实现以上思路,缺点是需要编写额外的代码发布到生产环境,一来增加工作量,二来太low
编写lua脚本,直接生产环境执行即可
下面说一下采用lua脚本如何实现批量keys 重命名
Lua脚本编写
"local ks = redis.call('KEYS', '20000000*')
for i = 1, #ks do
local val = redis.call('GET', ks[i])
redis.call('SETEX', 'ke-community-move:login:wxApplet:openid:'..tostring(ks[i]), 2592000, val)
end
return 'OK'"
脚本编写完成,说一下以上脚本的含义
local ks = redis.call('KEYS', '20000000') 表示执行keys 20000000 查询出所有匹配20000000前缀的key名称列表
for 循环遍历1中查询出的列表,注意一下下标从1开始
local val = redis.call('GET', ks[i]) 表示获取每一个key对应的value
redis.call('SETEX', 'ke-community-move:login:wxApplet:openid:'..tostring(ks[i]), 2592000, val) 表示重新设置key value值,并添加过期时间(单位/秒),注意过期时间在新key和value的中间,且lua脚本中字符串拼接不是一个加号,而是"..",非字符类型的需要采用tostring()转换以后才能拼接
Lua 脚本执行
打开redis desktop manager客户端,打开Console控制台
输入 eval "Lua 脚本" 0
后面的0代表该Lua脚本不需要输入参数,不可以不写
执行成功后刷新redis desktop manager客户端,即可看到呈现目录接口的key啦
批量删除原键值对
最后,删除原来的keys即可,同样编写批量删除的Lua脚本,基本上和重命名的脚本类似
Lua批量删除脚本
eval "local ks = redis.call('KEYS', '20000000*')
for i = 1, #ks do
redis.call('DEL', ks[i])
end
return 'OK'" 0
执行结果
结语
遇到问题多思考,解决问题的办法有很多,我们需要不断追求进步,学习新的知识,才能不断的提高自己