使用Java和NoSQL数据库开发的Web应用程序有哪些不同的缓存方式?数据库也提供缓存,它们是唯一且始终是最好的缓存选项吗?
除了数据库之外,我还可以如何缓存应用程序中的用户数据。应用程序包含非常特定于用户的数据,例如社交网络中的数据。是否有一些简单的规则来确定应该缓存哪些类型的内容?
我是否也可以使用Java在应用程序服务器上缓存我的数据?
使用Java和NoSQL数据库开发的Web应用程序有哪些不同的缓存方式?数据库也提供缓存,它们是唯一且始终是最好的缓存选项吗?
除了数据库之外,我还可以如何缓存应用程序中的用户数据。应用程序包含非常特定于用户的数据,例如社交网络中的数据。是否有一些简单的规则来确定应该缓存哪些类型的内容?
我是否也可以使用Java在应用程序服务器上缓存我的数据?
最后,真正的机制:从简单且在进程中的东西开始,比如一个有限大小和最近最少使用驱逐策略的映射。这很简单但有效。像 EHCache 这样的外部进程更复杂,但有两个优点:你可以在多个进程之间共享缓存(如果你有一个集群,在某些时候可能会很有用),并且你可以将数据存储在垃圾回收器看不到的位置,这可能会节省一些 CPU 时间(可能 - 这是一个太大的主题,本文无法深入探讨)。
但我重申我的第一点:在知道需要缓存什么之前不要进行缓存,一旦你知道了,要注意缓存的好处受限的限制,并尽量使你的缓存策略尽可能简单(但当然不能过于简单)。
假设您正在构建一个相对典型的Web应用程序,其中:
现在,回答您的一些问题。大多数持久性数据库或NoSQL数据库都可能具有某种缓存功能,使得如果您重复执行相同的简单查询(例如按主键检索),它能够缓存结果。但是,查询越复杂,持久性执行缓存的可能性就越小。此外,如果只有一个服务器用于持久性(即没有分片或写入主/读取从),则它很快成为瓶颈。因此,您想要进行的应用程序级缓存通常应该发生在Web服务器上,以减少对数据库的负载。
至于应该缓存什么,启发式方法是频繁访问和/或生成成本高昂的项(从数据库/ Web服务器处理/ 内存方面考虑)。典型的候选者是网站的主页和任何其他着陆页面-通常最好的方法是生成静态文件并提供服务。下一步取决于您的应用程序,但通常最有效的策略是尽可能靠近最终结果进行缓存-通常是提供的HTML。对于您的社交网络,这可能是一些特色更新列表之类的。
就用户会话而言,这些肯定是缓存的好选择。在这种情况下,您可能可以通过审慎使用Web服务器的会话范围(假设是JSP服务器)获得很多收益。这些数据保存在内存中,并且是保留用户在每个页面上认证后显示的特定信息的好地方(例如姓和名)。
现在需要考虑的最后一件事是处理缓存失效,这实际上是所有问题中最难的部分(命名事物是计算机科学中的另一个难题)。在这种情况下,像memcached或者ehcache这样的工具是正确的选择,正如其他人所提到的那样。ehcache可以轻松地与您的Java应用程序在同一进程中运行,并且可以很好地过期,采用最近最少使用和最不频繁使用的策略,并允许您同时使用内存和磁盘进行缓存。您需要思考的是,当数据发生更改时,您需要在缓存之前使缓存失效的情况。在这种情况下,您需要在应用程序架构中解决这些依赖关系,以适当地读取/写入缓存。