小编典典

Redis中的Azure缓存/数据缓存样式区域

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缓存,

任何人都知道如何使用Redis实现类似于Azure DataCache区域的功能,或者您能建议我可能明显缺少的明显功能。

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

谢谢加雷斯

更新:

我已经发现了一些的bash命令,可以做到通过模式删除键,用’键的命令包括的工作在这里)和LUA脚本EVAL命令在这里。

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

感谢您的阅读,Gareth


阅读 306

收藏
2020-06-20

共1个答案

小编典典

您可以使用此方法,利用异步/等待功能和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或将其作为方法参数接收。

2020-06-20