如何使用StackExchange.Redis删除与指定密钥模式匹配的所有密钥?
我在Redis缓存中有大约150000个密钥,需要删除其中95%以上的密钥(所有密钥都匹配一个特定的密钥前缀),作为缓存重建的一部分。在我看来,实现这一目标有三种方法:如何使用StackExchange.Redis删除与指定密钥模式匹配的所有密钥?,redis,stackexchange.redis,Redis,Stackexchange.redis,我在Redis缓存中有大约150000个密钥,需要删除其中95%以上的密钥(所有密钥都匹配一个特定的密钥前缀),作为缓存重建的一部分。在我看来,实现这一目标有三种方法: 使用server.Keys(模式)拉出与我的前缀模式匹配的整个密钥列表,并对每个密钥迭代调用KeyDelete 在Redis集中维护一个键列表-每次插入值时,我也会在相应的键集中插入键,然后检索这些键集,而不是使用键。这将避免昂贵的Keys()调用,但仍然依赖于逐个删除数以万计的记录 隔离特定编号数据库中的所有易失性数据,并在缓
(背景:Redis作为Microsoft Dynamics CRM API前面的一个视图模型,因此在第一次运行时,通过从CRM中提取大约10万条记录来填充缓存,然后通过在修改实体时从CRM中发布通知来保持同步。数据无限期地缓存在Redis中,我们正在处理特定的场景在这里,CRM插件在一段时间内无法启动,这会导致缓存漂移,并最终需要我们刷新和重建缓存。)两个选项2和3都是合理的 避开选项1。关键点确实很慢,而且只会随着关键点空间的增加而变慢
我通常会选择2(如果没有LUA,包括LUA,将增加学习曲线以支持解决方案-如果合理且假设它的存在是明确的/有文档记录的,这当然是好的。),但3绝对可以是一个竞争者,只要您能确保不会超过配置的DB限制,它就可以快速简单地成为竞争者。使用扫描流而不是按键,它将像一个魔咒一样工作。 文件- 下面的代码可以获得一个以LOGIN::开头的密钥数组,您可以循环遍历该数组并执行redis DEL命令来删除相应的密钥 nodejs中的示例代码:-
const redis = require('ioredis');
let stream = redis.scanStream({
match: "LOGIN::*"
});
stream.on("data", async (keys = []) => {
let key;
for (key of keys) {
if (!keysArray.includes(key)) {
await keysArray.push(key);
}
}
});
stream.on("end", () => {
res(keysArray);
});
对于选项2。您可以使用标记机制进行失效,例如,或者这是否有帮助?您使用了什么解决方案?谢谢