• 常用redis-lua脚本


    REDIS控制台

    1. 进入控制台

    E:\soft\Redis-x64-5.0.14.1\redis-cli.exe -h 127.0.0.1 -p 6379 -a password
    
    • 1

    常用redis-lua脚本

    在REDIS控制台输入

    1. 查询以xxx为前缀的key的数量

    local prefix = ARGV[1]
    local keys = redis.call('KEYS', prefix .. '*')
    return #keys
    
    • 1
    • 2
    • 3
    对应EVAL脚本,可直接在控制台执行
    EVAL "local prefix = ARGV[1] local keys = redis.call('KEYS', prefix .. '*') return #keys" 0 "xxx"
    
    • 1

    2. 用于在 Redis 中统计具有相同前缀(前n个字符)的键名的数量

    local cursor = '0'
    local allKeys = {}
    repeat
        local result = redis.call('SCAN', cursor, 'MATCH', '*', 'COUNT', '1000')
        cursor = result[1]
        local keys = result[2]
        for _, key in ipairs(keys) do
            table.insert(allKeys, key)
        end
    until cursor == '0'
    
    local groups = {}
    for _, key in ipairs(allKeys) do
        -- 前6个字符
        local prefix = string.sub(key, 1, 6)
        if not groups[prefix] then
            groups[prefix] = 1
        else
            groups[prefix] = groups[prefix] + 1
        end
    end
    
    local result = {}
    for prefix, count in pairs(groups) do
        table.insert(result, { prefix = prefix, count = count })
    end
    
    table.sort(result, function(a, b)
        return a.count > b.count
    end)
    
    local sortedResult = {}
    for _, item in ipairs(result) do
        table.insert(sortedResult, item.prefix .. ':' .. item.count)
    end
    
    return sortedResult
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    对应EVAL脚本,可直接在控制台执行
    EVAL "local cursor='0';local allKeys={};repeat local result=redis.call('SCAN',cursor,'MATCH','*','COUNT','1000');cursor=result[1];local keys=result[2];for _,key in ipairs(keys) do table.insert(allKeys,key) end;until cursor=='0';local groups={};for _,key in ipairs(allKeys) do local prefix=string.sub(key,1,6);if not groups[prefix] then groups[prefix]=1 else groups[prefix]=groups[prefix]+1 end end;local result={};for prefix,count in pairs(groups) do table.insert(result,{prefix=prefix,count=count}) end;table.sort(result,function(a,b) return a.count>b.count end);local sortedResult={};for _,item in ipairs(result) do table.insert(sortedResult,item.prefix..':'..item.count) end;return sortedResult;" 0
    
    • 1

    3. 用于在 Redis 中统计具有相同前缀(前n个字符)的键名的数量,可控制查询db,目前0-15

    -- 要查询的db数
    local numDbs = 16
    local result = {}
    -- 查询db起
    for db = 0, numDbs - 1 do
        redis.call('SELECT', db)
        local cursor = '0'
        local groups = {}
    
        repeat
            local scanResult = redis.call('SCAN', cursor, 'MATCH', '*', 'COUNT', '1000')
            cursor = scanResult[1]
            local keys = scanResult[2]
    
            for _, key in ipairs(keys) do
                -- 前6个字符
                local prefix = string.sub(key, 1, 6)
    
                if not groups[prefix] then
                    groups[prefix] = { count = 1, db = db }
                else
                    groups[prefix].count = groups[prefix].count + 1
                end
            end
        until cursor == '0'
    
        local tempResult = {}
    
        -- 将每个前缀的信息存储到临时表中
        for prefix, data in pairs(groups) do
            table.insert(tempResult, { prefix = prefix, count = data.count, db = data.db })
        end
    
        -- 按照数量从大到小排序
        table.sort(tempResult, function(a, b) return a.count > b.count end)
    
        -- 将排序后的结果插入到最终结果中
        for _, data in ipairs(tempResult) do
            table.insert(result, data.prefix .. ': ' .. data.count .. ' (DB: ' .. data.db .. ')')
        end
    end
    
    return result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    对应EVAL脚本,可直接在控制台执行
    EVAL "local numDbs=16 local result={} for db=0,numDbs-1 do redis.call('SELECT',db) local cursor='0' local groups={} repeat local scanResult=redis.call('SCAN',cursor,'MATCH','*','COUNT','1000') cursor=scanResult[1] local keys=scanResult[2] for _,key in ipairs(keys)do local prefix=string.sub(key,1,6) if not groups[prefix]then groups[prefix]={count=1,db=db}else groups[prefix].count=groups[prefix].count+1 end end until cursor=='0' local tempResult={} for prefix,data in pairs(groups)do table.insert(tempResult,{prefix=prefix,count=data.count,db=data.db})end table.sort(tempResult,function(a,b)return a.count>b.count end)for _,data in ipairs(tempResult)do table.insert(result,data.prefix..': '..data.count..' (DB: '..data.db..')')end end return result" 0
    
    • 1

    4.EVAL脚本用于删除以test为前缀的key

    EVAL "local keys = redis.call('KEYS', ARGV[1]) for i, key in ipairs(keys) do redis.call('DEL', key) end return keys" 0 "test*"
    
    • 1

    5.EVAL脚本用于删除以test为前缀的key,在0-15db中

    EVAL "for db=0, 15 do redis.call('SELECT', db) for _, key in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', key) end end" 0 "rta*"
    
    • 1

    6.EVAL脚本用于删除过期时间为 -1 dekey

    确认要删除的数据无误或已备份,并谨慎使用

    EVAL "local keys = redis.call('KEYS', '*')\nfor i, key in ipairs(keys) do\n    local ttl = redis.call('TTL', key)\n    if ttl == -1 then\n        redis.call('DEL', key)\n    end\nend\nreturn 'Deleted expired keys'" 0
    
    • 1

    原文路径

  • 相关阅读:
    Pro_11丨跟踪+目标出场自适应切换
    43页县域农业大数据运营服务中心方案介绍
    《上海悠悠接口自动化平台》-2.extract 提取结果与validate 校验结果
    R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化分组散点图(scatter plot)、设置add参数为每个分组添加回归线
    雅可比矩阵和雅可比坐标
    golang trace view 视图详解
    【算法练习Day5】有效的字母异位词 &两个数组的交集&&快乐数&&两数之和
    Java通过ServerSocket与Socket实现通信,各种例子
    Java实现学生管理系统
    【程序人生】4年创作纪念日,不忘初心,继续前行
  • 原文地址:https://blog.csdn.net/weixin_41187876/article/details/133854666