![d9b3bf61fc799c35523197521562c468.png](https://i-blog.csdnimg.cn/blog_migrate/afa6e31d6047585d43af90387f571c99.jpeg)
作者 | 黄永灿
后端开发攻城狮,关注服务端技术与性能优化。
什么时候需要缓存
一般来说会从两个方面来判断是否需要缓存:
- CPU 占用:如果某些应用需要消耗大量的 CPU 资源去计算,例如你使用正则表达式比较频繁或者业务查询链很复杂时,而它又占用了很多 CPU 的话,那就应该使用缓存将结果缓存下来。
- 数据库 IO 占用:如果你发现你的数据库连接池比较空闲,可以不用缓存。但是如果数据库连接池比较繁忙,甚至经常报出连接不够的报警,那么是时候应该考虑缓存了。
如何选择合适缓存
缓存主要分为本地缓存和分布式缓存。本地缓存的优点在于没有网络延迟查询速度快,缺点是在集群环境下容易出现数据不一致的情况,以及缓存过大时容易触发 GC,分布式缓存的优点在于数据一致性得到了保证,并且独立于应用程序,扩展维护方便。
本地缓存
首先来对比一下几个常用的本地缓存,具体原理可以参考你应该知道的缓存进化史:
![39e5818e7ed9dce8eac627945460263f.png](https://i-blog.csdnimg.cn/blog_migrate/b1448c7e1073c4eeffa6bb794f59e7d0.jpeg)
- ConcurrentHashMap 比较适合缓存比较固定不变的元素,且缓存的数量较小的。虽然从上面表格中比起来有点逊色,但是由于它是 JDK 自带的类,在各种框架中依然有大量的使用。比如我们可以用来缓存反射的 Method,Field 等等。
- LRUMap 相对于 ConcurrentHashMap 引入了淘汰算法,如果不想引入第三方包,又想使用淘汰算法淘汰数据,可以使用这个。
- 对于 Ehcache 来说,由于其 jar 包很大,较重量级。对于需要持久化和集群的一些功能的,可以选择 Ehcache,但一般都会用分布式缓存来替代它。
- 对于 Guava Cache 来说,Guava 这个 jar 包在很多 Java 应用程序中都有大量的引入。 所以很多时候直接用就好了,并且它本身是轻量级的而且功能较为丰富,在不了解 Caffeine 的情况下可以选择 Guava Cache。
- 对于 Caffeine 来说,很多人把它形容为未来的缓存,它在命中率,读写性能上都比 Guava Cache 好很多。 并且它的 API 和 Guava Cache 基本一致,甚至会多一点。以下是 Caffeine 和其他缓存的读写性能对比。
![e1871496ec00209f735d0f9b0415f50a.png](https://i-blog.csdnimg.cn/blog_migrate/5cc023560b32adf7c296464fd44d3ff5.jpeg)
总结一下:如果不需要淘汰算法则选择 ConcurrentHashMapÿ