【问题标题】:ASP.NET InProc caching vs distributed cacheASP.NET InProc 缓存与分布式缓存
【发布时间】:2014-10-26 14:04:33
【问题描述】:
我正在研究 Redis 和替代方案,因为我们将转向编写分布式应用程序。我的想法是我们需要像 Redis 这样的分布式缓存来确保我们在任何地方都有一致的缓存。我的高级同事不同意,并说我们应该只使用选择性 InProc 缓存,其中一些数据在请求时缓存在机器的内存中。他还表示,Redis 会比缓存数据 InProc 慢得多。他同意我们应该将 Session 状态存储在分布式缓存中,因为这需要保持一致。
保存缓存的最佳位置是什么? InProc 还是分布式?
【问题讨论】:
标签:
asp.net
caching
redis
distributed-computing
distributed-caching
【解决方案1】:
使用进程内或进程外缓存完全取决于应用程序。
Inproc 缓存将数据存储在当前应用程序的进程内存中,这使得缓存数据访问速度非常快,但缓存数据只能由本地应用程序访问。如果您只有一个应用程序服务器,或者如果每个应用程序服务器都使用不同的数据集,则此方法可以正常工作。即使这样,如果应用服务器宕机,缓存的数据也会丢失。
但是,如果您的多个应用服务器使用相同的数据集,Inproc 缓存并不是最佳解决方案。因为在这种情况下,每个应用程序都将加载相同的数据集,因此限制了使用缓存的有用性。
此外,对于会话状态缓存,您只能选择使用粘性会话,这反过来又会限制负载平衡。
另一方面,分布式缓存会增加从另一台服务器获取数据的额外网络成本,但它会给您带来与所有其他应用程序共享相同数据集的优势。不仅如此,即使应用服务器宕机,数据也会保持缓存状态。
您还可以使用 Inproc 和 OutProc 缓存的混合解决方案,例如 NCache 提供的解决方案,您可以在其中拥有分布式集群缓存(包含所有缓存数据)和本地 inproc 缓存(包含数据子集,该应用程序服务器经常使用)。这将为您提供两种缓存技术的优势。
由于您正在重写您的应用程序,我建议您尝试NCache。它提供进程内和进程外解决方案。您只能编写一次应用程序,使用两种解决方案对其进行测试,然后选择最适合您的一种。
【解决方案2】:
InProc 和分布式缓存不是相互排斥的,也不是您唯一的选择。你也可以有distributed invalidation solutions。
您还应该更仔细地检查您真正需要的“一致”缓存。保证会话状态真正一致的唯一方法是锁定它。这将序列化来自同一用户的同时请求。
你确定你真的想要/需要会话状态吗?如果您要跟踪的内容是基于安全性的,您确定不能处理稍微陈旧的数据吗?如果它是基于用户状态的,它很可能会呈现到客户端页面中,而不是在服务器上独立跟踪。