2

我正在计划将 C# ASP.Net Web 应用程序移至 Azure(当前托管在单个专用服务器上),并且正在研究缓存选项。目前,因为我们一次只运行一个应用程序实例,所以我们有一个“进程中”内存缓存来减轻 SQL DB 中一些相同的请求。

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

我们计划迁移到 Azure 已经有一段时间了,当我们第一次开始查看 Azure Redis 缓存服务不可用的所有内容时,至少不支持,所以我们查看了基于 AppFabric 的 Azure 缓存服务。使用这个我们决定我们将使用 DataCache 区域来分隔不同的对象类型,然后只刷新受影响的区域,虽然不像我们当前的方法那么精确,但可以。现在,自从 Redis 出现以来,我们一直在研究它,如果可能的话,我们更愿意使用它。但是,似乎要实现相同的目标,我们必须为每个“区域”/部分设置单独的 Redis 缓存,

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

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

谢谢,加雷斯

更新:

我发现了一些 bash 命令可以完成按模式删除键的工作,包括在此处使用 'KEYS' 命令和在此处使用 lua 脚本 EVAL 命令。

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

感谢阅读,加雷斯

4

2 回答 2

8

您可以使用此方法利用 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.

或者

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

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

于 2015-12-22T11:03:10.913 回答
0

对于我对您的问题的理解,您需要根据某些标准(在您的情况下为用户)对数据进行分组,以便每当与该标准相关的记录发生更改时,与该记录相关的所有数据也会在缓存中使用单个缓存 API 调用。

您可以在 Azure 中使用NCache for Azure实现此目的,这是Alachisoft为 azure 提供的分布式缓存解决方案,具有丰富的功能集和多个缓存拓扑。

NCache允许以多种方式执行此类操作。一种适合您的用例的是数据分组功能,它允许您在添加时将数据分组到组/子组中。以后可以根据组/子组获取/删除数据。

NCache 还允许添加带有正在添加项目的标签。这些标签随后可用于移除/获取包含一个或多个指定标签的所有数据。NCache 中提供的查询功能(删除查询)也可用于删除满足特定条件的数据。

于 2014-11-25T19:15:30.200 回答