美文网首页
记录一次用lua脚本重命名redis中已存在的大量键值对名

记录一次用lua脚本重命名redis中已存在的大量键值对名

作者: 0爱上1 | 来源:发表于2018-11-19 17:07 被阅读42次

    场景

    线上生产环境redis库中保存了大量的没有文件层级结构的键值对,这样对于使用redis desktop manager客户端来说所有的key都在同一层级,不便于管理

    类似这种

    image.png

    解决思路

    • 匹配20000000前缀的key,获取到key列表

    • 遍历获取每一个key对应的value值

    • 重新set新的key名称和老的value值

    落地方案

    1. 编写Java程序,借助redisTemplate提供的方法,实现以上思路,缺点是需要编写额外的代码发布到生产环境,一来增加工作量,二来太low

    2. 编写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'"
    

    脚本编写完成,说一下以上脚本的含义

    1. local ks = redis.call('KEYS', '20000000') 表示执行keys 20000000 查询出所有匹配20000000前缀的key名称列表

    2. for 循环遍历1中查询出的列表,注意一下下标从1开始

    3. local val = redis.call('GET', ks[i]) 表示获取每一个key对应的value

    4. 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控制台

    image.png

    输入 eval "Lua 脚本" 0

    image.png

    后面的0代表该Lua脚本不需要输入参数,不可以不写

    执行成功后刷新redis desktop manager客户端,即可看到呈现目录接口的key啦

    image.png

    批量删除原键值对

    最后,删除原来的keys即可,同样编写批量删除的Lua脚本,基本上和重命名的脚本类似

    Lua批量删除脚本
    eval "local ks = redis.call('KEYS', '20000000*') 
     for i = 1, #ks do
        redis.call('DEL', ks[i])
    end
    return 'OK'" 0
    
    执行结果
    批量删除

    结语

    遇到问题多思考,解决问题的办法有很多,我们需要不断追求进步,学习新的知识,才能不断的提高自己

    相关文章

      网友评论

          本文标题:记录一次用lua脚本重命名redis中已存在的大量键值对名

          本文链接:https://www.haomeiwen.com/subject/uzjafqtx.html