我们在 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/