如何使用StackExchange.Redis删除与指定密钥模式匹配的所有密钥?

如何使用StackExchange.Redis删除与指定密钥模式匹配的所有密钥?,redis,stackexchange.redis,Redis,Stackexchange.redis,我在Redis缓存中有大约150000个密钥,需要删除其中95%以上的密钥(所有密钥都匹配一个特定的密钥前缀),作为缓存重建的一部分。在我看来,实现这一目标有三种方法: 使用server.Keys(模式)拉出与我的前缀模式匹配的整个密钥列表,并对每个密钥迭代调用KeyDelete 在Redis集中维护一个键列表-每次插入值时,我也会在相应的键集中插入键,然后检索这些键集,而不是使用键。这将避免昂贵的Keys()调用,但仍然依赖于逐个删除数以万计的记录 隔离特定编号数据库中的所有易失性数据,并在缓

我在Redis缓存中有大约150000个密钥,需要删除其中95%以上的密钥(所有密钥都匹配一个特定的密钥前缀),作为缓存重建的一部分。在我看来,实现这一目标有三种方法:

  • 使用server.Keys(模式)拉出与我的前缀模式匹配的整个密钥列表,并对每个密钥迭代调用KeyDelete
  • 在Redis集中维护一个键列表-每次插入值时,我也会在相应的键集中插入键,然后检索这些键集,而不是使用键。这将避免昂贵的Keys()调用,但仍然依赖于逐个删除数以万计的记录
  • 隔离特定编号数据库中的所有易失性数据,并在缓存重建开始时完全刷新它
  • 我正在使用.NET和StackExchange.Redis客户端-我在其他地方看到过使用CLI或依赖Lua脚本的解决方案,但似乎没有解决这个特定的用例-我是否错过了一个技巧,或者这仅仅是您不应该使用Redis做的事


    (背景: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。您可以使用标记机制进行失效,例如,或者这是否有帮助?您使用了什么解决方案?谢谢