【问题标题】:How do I delete all keys matching a specified key pattern using StackExchange.Redis?如何使用 StackExchange.Redis 删除与指定键模式匹配的所有键?
【发布时间】:2016-07-28 14:13:43
【问题描述】:

我在 Redis 缓存中有大约 150,000 个键,作为缓存重建的一部分,我需要删除其中 95% 以上的键——所有键与特定键前缀匹配。正如我所看到的,有三种方法可以实现这一点:

  1. 使用 server.Keys(pattern) 提取与我的前缀模式匹配的整个键列表,并遍历每个键调用 KeyDelete 的键。
  2. 维护Redis set 中的key 列表——每次插入值时,我也会在对应的key set 中插入key,然后检索这些set 而不是使用Keys。这将避免昂贵的 Keys() 调用,但仍依赖于逐条删除数万条记录。
  3. 将我的所有易失数据隔离在特定编号的数据库中,并在缓存重建开始时将其完全刷新。

我正在使用 .NET 和 StackExchange.Redis 客户端 - 我在其他地方看到过使用 CLI 或依赖 Lua 脚本的解决方案,但似乎没有解决这个特定用例的问题 - 我是否错过了一个技巧,或者这只是你不应该用 Redis 做的事情吗?

(背景:Redis 充当 Microsoft Dynamics CRM API 前面的视图模型,因此在第一次运行时通过从 CRM 中提取大约 10 万条记录来填充缓存,然后通过从 CRM 中发布通知来保持同步每当一个实体被修改时,数据会无限期地缓存在 Redis 中,我们在这里处理一个特定的场景,即 CRM 插件在一段时间内无法触发,这会导致缓存漂移,最终需要我们刷新和重建缓存。 )

【问题讨论】:

标签: redis stackexchange.redis


【解决方案1】:

选项 2 和 3 都是合理的。

避开选项 1。KEYS 确实很慢,并且只会随着键空间的增长而变慢。

我通常会选择 2(没有 LUA,包括 LUA 会增加学习曲线以支持解决方案 - 如果有理由并且假设它的存在是明确/记录的,这当然很好。),但 3 绝对可以是竞争者,快速而简单,只要你能确定你不会超过配置的数据库限制。

【讨论】:

  • 这有帮助吗?你用了什么解决方案?谢谢
【解决方案2】:

使用 scanStream 代替键,它会像魅力一样工作。 文档 - https://redis.io/commands/scan 下面的代码可以得到一个以LOGIN::开头的key数组,你可以循环遍历数组并执行redis DEL命令来删除对应的key。

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);
                    });

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 2021-07-25
    • 1970-01-01
    • 2023-03-21
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2020-02-18
    相关资源
    最近更新 更多