Redis 中的 Azure 缓存/DataCache 样式区域

2023-12-05

我正在计划将 C# ASP.Net Web 应用程序迁移到 Azure(当前托管在单个专用服务器上),并且正在考虑缓存选项。目前,由于我们一次只运行一个应用程序实例,因此我们有一个“进程内”内存缓存来缓解 SQL DB 的一些相同请求。

目前的过程是当管理器/服务对数据库的某些部分进行更改时清除缓存的某些部分,例如我们有一个用户表,我们将拥有像“User.{0}”这样的键,返回单个用户记录/对象,而“Users.ForeignKey.{0}”则返回与外键相关的所有用户。如果我们更新单个用户记录,那么我们将删除“User.1”键(如果 userid = 1),并为了方便起见,删除所有列表集合,因为它们可能已更改。我们通过按模式删除键来做到这一点,这意味着只有受影响的键会被删除,而所有其他键都会保留。

我们计划向 Azure 迁移已经有一段时间了,当我们第一次开始查看所有内容时,Azure Redis 缓存服务不可用,至少不支持,因此我们查看了基于 AppFabric 的 Azure 缓存服务。通过这个,我们决定使用 DataCache 区域来分隔不同的对象类型,然后只刷新受影响的区域,虽然不像我们当前的方法那么精确,但还可以。现在,自从 Redis 出现以来,我们一直在关注它,并且如果可能的话更愿意使用它。然而,似乎要实现同样的目标,我们必须为每个“区域”/部分拥有单独的 Redis 缓存,根据我的理解,这意味着我们需要为 Azure 的 Redis 缓存服务的许多小型实例付费,这考虑到我们需要 10 多个单独可刷新的部分到缓存,这将花费相当多的成本。

任何人都知道如何使用 Redis 实现与 Azure DataCache 区域类似的功能,或者您能否提出一些我可能遗漏的明显明显的功能。

很抱歉提出这么长的问题/解释,但我发现在没有背景/上下文的情况下很难解释我想要实现的目标。

谢谢, 加雷思

Update:

我发现了一些 bash 命令可以完成按模式删除键的工作,包括使用“KEYS”命令here和lua脚本EVAL命令here.

我计划使用 StackExchange.Redis 客户端进行交互,有谁知道在使用 StackExchange.Redis 时如何使用这些类型的命令或替代命令(按模式删除键)?

感谢您的阅读,加雷斯


您可以使用这种利用 async/await 功能的方法Redis 流水线使用以下模式按模式删除键堆栈交换Redis客户端

private static Task DeleteKeysByPatternAsync(string pattern)
{
    IDatabase cache1 = Connection.GetDatabase();
    var redisServer1 = Connection.GetServer(Connection.GetEndPoints().First());
    var deleteTasks = new List<Task>();
    var counter = 0;
    foreach (var key in redisServer1.Keys(pattern: pattern, database: 0, pageSize: 5000))
    {
        deleteTasks.Add(cache1.KeyDeleteAsync(key));
        counter++;
        if (counter % 1000 == 0)
            Console.WriteLine($"Delete key tasks created: {counter}");
    }
    return Task.WhenAll(deleteTasks);
}

然后你可以像这样使用它:

DeleteKeysByPatternAsync("*user:*").Wait(); //If you are calling from main method for example where you cant use await.

or

await DeleteKeysByPatternAsync("*user:*"); //If you run from async method

您可以调整 pageSize 或作为方法参数接收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 中的 Azure 缓存/DataCache 样式区域 的相关文章

随机推荐