使用 Redis 集群实现缓存突破

目前我们正在使用 Redis 集群。

在一些情况下,我们需要删除数十万个缓存对象。我想知道目前最好的方法是什么?

目前,我们使用带有扫描和解除链接的 LUA 脚本执行。

private const string ClearCacheLuaScript = (@"
local cursor = 0
local calls = 0
local dels = 0
repeat
    local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1])
    calls = calls + 1
    for _,key in ipairs(result[2]) do
        redis.call('UNLINK', key)
        dels = dels + 1
    end
    cursor = tonumber(result[1])
until cursor == 0");

public async Task FlushAllAsync(string section, string group, string prefix)
{
    var cacheKey = GetCacheKey(section, group, prefix);
    await _cache.ScriptEvaluateAsync(ClearCacheLuaScript
        , values: new RedisValue[]
            {
            cacheKey+"*",
            });
}

目前正在思考是否使用迭代的方式通过键来删除。类似于

public async Task FlushAllKeys()
{
    foreach(var key in keys)
    {
        await _cache.KeyDeleteAsync(key );
    }
}

我的主要问题是,我应该通过使用 LUA 脚本并使用模式删除还是获取所有键并迭代删除而不使用 LUA 脚本。

原文链接 https://stackoverflow.com/questions/71213672

点赞