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

Caching large objects for HA with C# asp.net / Net 4.7

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

一开始,我使用的是 MemoryCache(单服务器),但现在我们要走 HA 路线,我们需要它对所有服务器都可用。

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

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

感谢阅读:)

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

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

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

请记住,这会使缓存失效要求变得非常复杂。即使您可以将每个 属性 单独存储在 Redis 中,如果您在获取后将该值存储在每台机器上的变量中,您很快就会 运行 进入非托管缓存情况,在这种情况下您无法保证同步数据,具体取决于哪个机器为下一个请求提供服务。