ServiceStack 的 Azure Redis 缓存始终在增加

标签 azure caching redis servicestack

我们在 Azure 上有一个基于 ServiceStack 的 Web 应用程序和 API,可以处理每天生成大约 10,000 个 Web 请求的 Twilio 流量。 ServiceStack 设置为使用 Azure Redis 缓存进行缓存:

private void ConfigureCache(Container container)
{
    container.Register<IRedisClientsManager>(c => 
        new RedisManagerPool(AppSettings.GetString("RedisConnectionString")));

    container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
}

缓存目前仅用于 ServiceStack 的内置 session 管理,但我们将在即将推出的版本中缓存 API 响应。

但是,由于某种原因,ServiceStack 似乎永远不会过期或刷新 key 。缓存的使用量一直在稳步增加,导致应用程序在达到 Azure 中最初的 250GB 限制时崩溃。我们很快将其增加到 1G,但几个月后我们已经达到 850GB,并且使用量图表显示出稳定的线性增长。

我已经将 maxmemory-policy 设置为 allkeys-lru,但我不想等到缓存满了才看看效果如何。我犹豫是否简单地进入并在缓存上执行 flushall 。还有其他方法可以确保 key 被删除吗?

最佳答案

如果您没有为缓存条目指定过期时间,则表示您不希望 key 过期。要使 key 无效,您可以在设置缓存 key 时指定 TimeSpan 来确定 key 的有效时间,例如:

client.SetValue(key, value, TimeSpan.FromMinutes(1));

或者单独调用 ExpireEntry* APIs指定 key 过期时间:

bool ExpireEntryIn(string key, TimeSpan expireIn);
bool ExpireEntryAt(string key, DateTime expireAt);

SessionBag 过期

SessionBag 允许您添加有关用户的临时信息,这些信息可以在用户进行身份验证之前/之后进行检查。默认情况下,SessionBag 内的缓存项目不会过期,但会从 v4.0.57 that's now on MyGet 开始过期。您可以通过设置指定 SessionBag 内的 key 应过期:

this.GetPlugin<SessionFeature>().SessionBagExpiry = TimeSpan.FromDays(14);

关于ServiceStack 的 Azure Redis 缓存始终在增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41910352/

相关文章:

sql-server - 无法下载 msnodesql-0.2.1-v0.10-x64.msi

c# - 当 ServiceBusTrigger Azure Function 中的消息无法处理时,如何将处理同一消息延迟 x 分钟?

php - 使用 PHP 进行缓存以减轻 MySQL 的压力

php - Redis如何组合排序集?

redis - 使用 stackexchange.Redis 批量删除?

node.js - 如何通过部署为 Node.js 应用程序设置 azure-web-app-service 应用程序设置

java - 如何使用 Java 在 azure blob 中私下上传文件后获取 SAS URL

asp.net-mvc - gzip 压缩不起作用并且无法在 chrome 中获取 304

http - Google Cloud Storage 文件缓存和过期问题

ruby-on-rails - 未初始化的常量 CreateJob::RestClient