asp.net - Redis 中的 Azure 缓存/DataCache 样式区域

标签 asp.net redis azure-caching stackexchange.redis

我正在计划将 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 Regions 的东西,或者你能建议一些我可能遗漏的非常明显的东西。

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

谢谢, 加雷思

更新:

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

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

感谢阅读,Gareth

最佳答案

您可以使用这种利用异步/等待功能和 redis pipelining 的方法使用 stack exchange redis client 按模式删除键

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.

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

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

关于asp.net - Redis 中的 Azure 缓存/DataCache 样式区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094938/

相关文章:

asp.net - 我可以设置 Visual Studio ASP.NET 开发服务器使用的 ASP.NET 版本吗?

java - 基于 java 的配置中基于 spring xml 的配置

MySQL 到 Redis - 导入和建模

azure - 缓存诊断建议使用 20GB 的本地存储(!)。为什么?

asp.net - 如何防止其他用户下载/打开其他文件?

javascript - ASP :hyperlink is not directing to the linked url

asp.net - DLL 引用 DLL

java - 为什么 Redis 抛出 NullPointerException 通过 JUnit 使用 spring 和默认配置运行?

node.js - 无法从node.js连接到azure缓存服务

c# - Azure blob 存储 - 分块文件上传 - 跨回发缓存数据