怎么模糊删除redis的key呢

德玛西亚

问题描述

  • @method static bool|array scan($it)
    看了一下这个不支持模式匹配(match)和计数(count)功能,那我大量模糊删除key怎么做呢?
123 1 0
1个回答

orangeFan

如果不涉及到集群的话 可以使用lua脚本实现
数据量不多情况可以直接使用keys

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

        $luaScript = <<<LUA
        local keys = redis.call('KEYS', ARGV[1])
        for i=1, #keys do
            redis.call('DEL', keys[i])
        end
        return #keys
        LUA;

        // 执行 Lua 脚本
        $pattern = 'keys*'; // 匹配的键模式
        $result = Redis::eval($luaScript, 0, $pattern);

数据量多的情况 可以使用scan代替

local cursor = '0'
local count = 0
repeat
    local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1], 'COUNT', 100)
    cursor = result[1]
    local keys = result[2]
    for i=1, #keys do
        redis.call('DEL', keys[i])
        count = count + 1
    end
until cursor == '0'
return count
// Lua 脚本
        $luaScript = <<<LUA
        local cursor = '0'
        local count = 0
        repeat
            local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1], 'COUNT', 100)
            cursor = result[1]
            local keys = result[2]
            for i=1, #keys do
                redis.call('DEL', keys[i])
                count = count + 1
            end
        until cursor == '0'
        return count
        LUA;

        // 执行 Lua 脚本
        $pattern = 'keys*'; // 匹配的键
        $result = Redis::eval($luaScript, [$pattern], 0);
×
🔝