我有一个文档,它在数组中的某些字段中保存了一个大数据结构,由于频繁命中读取这些数据,它正在减慢我的应用程序。我正在考虑实施的几个解决方案,但在我继续之前需要建议,甚至可能是更好的解决方案,这是我的想法/问题:
答案 0 :(得分:0)
缓存会有所帮助,因为它可以避免您的数据库过于频繁地被击中
Memcache或redis它取决于你。我更喜欢redis但是如果你已经有了memcache它很好。
如果您有一组服务器,请考虑是否需要集中式缓存
缓存完整文档对于获取单个字段不会有帮助,因为您在不知道查询结果的情况下缓存查询结果。
答案 1 :(得分:0)
您的问题需要进一步澄清。例如,您所说的数据有多大,几兆字节或千兆字节。所有这些因素都改变了解决方案但是,如果我们认为您有几兆字节,并且您希望每次最佳解决方案都是缓存时阻止调用数据库。如何选择缓存也完全取决于你的情况。如果您的Web应用程序在一台服务器上运行,您可以使用内存缓存,如ASP.Net缓存,这对于内存缓存非常快速和快速。此缓存存储在堆中,因此您可以将所有对象放在缓存中而不进行序列化。但请考虑每当您的应用程序像大多数部署一样重新启动时。您的堆将被删除,并且所有缓存都在堆内清除。
如果您有多个服务器,那么您可以开始考虑内存不足的缓存,因为两个服务器不共享堆内存并且使用所有内存缓存都没用,因为它复制了数据并且无效就是噩梦。但是,这是更可靠的缓存,而它不在堆中,并且在持久性方面不仅仅是内存缓存。但是,当您通过网络连接传输对象时,无论您想要在此类缓存中放置什么,都应该是可序列化的。所以你不能将所有对象都放在缓存中。 Redis和memcached都可用于此目的。 Redis比Memcached更复杂,功能更多但是为了你的目的,memcached非常好。
无论您选择哪种缓存系统,都要从广泛的角度来看待它。在您的应用程序中设计缓存系统,随着时间的推移,您需要在缓存中放入更多内容。所以从现在开始准备好所有东西都比较好。 另一个在缓存中非常重要的事情是,无论何时在缓存中设置某些内容,都必须考虑何时使其无效。
答案 2 :(得分:0)
缓存是否有用取决于文档的加入。如果多次访问文档,那么由于MongoDB对内存缓存的实际工作方式,缓存无济于事。
首先,您需要了解您的数据加入模式。