使用 C# asp.net / Net 4.7 为 HA 缓存大型对象



我正在尝试缓存一个需要可供用户使用 15 分钟的大对象(大约 25MB(。

一开始,我使用的是 MemoryCache(单个服务器(,但现在我们要采用 HA 路由,我们需要它可供所有服务器使用。

我们尝试用 Redis 替换它,但在序列化和反序列化对象以及往返(newtonsoft.json 序列化(之间大约需要 2 分钟(在本地主机上(。

因此,问题是:如何在 HA 中的服务器之间共享生命周期较短的大型对象?

感谢您阅读:)

我很幸运地使用Protobuf-net包从JSON切换到Protobuf ser/de。但是,听起来即使将其缩短到经常重复的 6 倍执行时间,在这种情况下,20 秒的反序列化时间可能仍然不会削减它 - 因为整个目标是为特定用户缓存它"短"时间。

这听起来像是急于加载与延迟加载的经典案例。 既然已经在使用 Redis,您是否考虑过将对象的每个属性单独缓存为单独的键?属性越多,因此每个属性越小,这种策略就越有利。当然,我假设对象上有一组相当正交的属性 - 如果其中许多属性相互依赖,那么这可能会表现得更糟。但是,如果访问模式往往不需要整个水合对象,则可以通过获取所需的单个属性而不是整个对象来大大提高响应能力。

我对你的对象有很多假设 - 但最简单的步骤是实现每个属性的get访问器来执行 Redis Get 调用。这在依赖项管理和多线程访问方面还有很多其他缺点,但可能是实现概念证明的简单方法。

请记住,这使缓存失效要求大大复杂化。即使您可以将每个属性单独存储在 Redis 中,如果您在获取后将该值存储在每台计算机上的变量中,您很快就会遇到非托管缓存情况,即您无法根据哪台计算机为下一个请求提供服务来保证同步数据。

最新更新