如何用StackExchange.Redis批量逐键检查Key是否存在?
StackExchange.Redis逐键检查键存在性的方案
如果你想批量检查多个键是否存在,同时得到每个键的存在状态(而非仅统计总数),可以用以下两种简便方法:
方法一:用Lua脚本批量处理(推荐)
Redis的EXISTS命令支持传入多个键,但原生返回的是存在的键的总数。通过Lua脚本可以一次性查询所有目标键的状态,返回每个键的存在标记,全程无需获取键的完整值,而且只需要一次网络请求,性能最优。
示例Lua脚本:
local result = {} for _, key in ipairs(KEYS) do table.insert(result, redis.call('EXISTS', key)) end return result
对应的C#调用代码:
// 定义要检查的键数组 var targetKeys = new RedisKey[] { "user:1001", "order:2003", "product:4005" }; // Lua脚本内容 var checkScript = @"local result = {} for _, key in ipairs(KEYS) do table.insert(result, redis.call('EXISTS', key)) end return result"; // 执行脚本并获取结果 var rawResults = (RedisResult[])db.ScriptEvaluate(checkScript, targetKeys); // 转换为Dictionary<string, bool>格式 var keyExistsDict = targetKeys .Zip(rawResults, (key, res) => new { Key = key.ToString(), Exists = (int)res == 1 }) .ToDictionary(item => item.Key, item => item.Exists);
方法二:批量调用KeyExists(适合少量键)
如果需要检查的键数量不多,也可以直接循环调用IDatabase.KeyExists(或异步版本KeyExistsAsync),逐个获取状态后组装成字典。不过这种方式会产生多次网络请求,键数量多的时候性能不如Lua脚本。
示例代码:
var targetKeys = new List<string> { "user:1001", "order:2003", "product:4005" }; var keyExistsDict = new Dictionary<string, bool>(); foreach (var key in targetKeys) { keyExistsDict[key] = db.KeyExists(key); }
内容的提问来源于stack exchange,提问作者Marco Slanzi
相关产品推荐
相关产品推荐

