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

问题描述 投票:1回答:1

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

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

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

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

谢谢阅读 :)

c# asp.net redis high-availability
1个回答
0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.