当前位置: 首页 > 面试题库 >

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

毕衡
2023-03-14
问题内容

我正在计划将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


问题答案:

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



 类似资料:
  • redis 形式的缓存 php 扩展需求 需要开启 php_memcache 扩展 redis 相关知识:http://www.hcoder.net/books/read_10105.html 修改或添加全局配置 phpGrace/config.php //缓存类型 'allowCacheType' => array('file', 'memcache', 'redis'), //缓存设置

  • 问题内容: 我想在Redis中实现绝对缓存和滑动缓存。没有人有任何资源链接,这将是有帮助的 问题答案: Redis已经为此提供了许多命令: 到期:设置密钥超时。 期望值:与以前相同,但是需要一个绝对的Unix时间戳(自1970年1月1日以来的秒数)。 TTL:返回具有超时功能的键的剩余生存时间 您必须了解有关Redis过期的重要一件事:仅当使用SET或GETSET移除或覆盖键时,才会清除超时值。所

  • 我一直在研究Redis(完全没有经验,只是研究了理论),在做了一些研究之后,发现它也被用作缓存。例如StackOverfolow it self。 有什么好处吗? 我试图直接浏览这个答案redis-cache-vs-using-memory-,但我想我没有得到答案中的关键行: “基本上,如果您需要您的应用程序在共享相同数据的几个节点上进行扩展,那么将需要类似Redis(或任何其他远程键/值存储)的

  • 数据缓存是指将一些 PHP 变量存储到缓存中,使用时再从缓存中取回。 它也是更高级缓存特性的基础,例如查询缓存 和内容缓存。 如下代码是一个典型的数据缓存使用模式。 其中 $cache 指向缓存组件: // 尝试从缓存中取回 $data $data = $cache->get($key); if ($data === false) { // $data 在缓存中没有找到,则重新计算它

  • setStorageSync 基础库1.3.9开始支持,iOS版本2.1.23,Android版本2.1.38 setStorageSync(string key, any data) ft.setStorage 的同步版本 参数 string key 本地缓存中指定的 key any data 需要存储的内容。只支持原生类型、Date、及能够通过JSON.stringify序列化的对象。 示例代

  • jd.setStorage(OBJECT) 异步接口,将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容。 OBJECT 参数说明: 参数 类型 必填 说明 key String 是 本地缓存中的指定的 key data Object/String 是 需要存储的内容 success Function 否 接口调用成功的回调函数 fail Function 否 接口调用失