1. 简介
在编程领域,缓存是不可或缺的一部分,从处理器到应用层,其应用无处不在。从根本上讲,缓存是利用空
间换取时间的一种策略,通过优化数据存储方式,提高后续数据访问速度。
对于Java开发者来说,有很多常用的缓存解决方案,例如EhCache和Memcached等。这些解决方案的核心
目标是提高系统吞吐量,减轻数据库等持久层的压力。
根据其部署和应用范围,缓存可以分为本地缓存和分布式缓存两种类型。Caffeine是一种非常优秀的本地缓
存解决方案,而Redis则广泛用于分布式缓存场景。
Caffeine是一个基于Java 1.8的高性能本地缓存库,源自Guava的改进。自Spring 5开始,Caffeine已成为默
认的缓存实现,取代了原先的Google Guava。官方资料显示,Caffeine的缓存命中率已接近理论最优值。实
际上,Caffeine与ConcurrentMap在功能上有许多相似之处,都支持并发操作,且数据的存取时间复杂度为
O(1)。然而,二者在数据管理策略上存在显著差异:
ConcurrentMap会保留存入的所有数据,除非用户显式地移除;
而Caffeine则根据预设的配置自动剔除“不常用”的数据,确保内存的合理使用。
因此,更恰当的理解是:Cache是一种具备存储和移除策略的Map。
2. 核心特性
高性能:Caffeine采用了多种优化技术,包括基于链表和哈希表的数据结构、优化的内存访问模式以及
针对并发访问的优化算法,以减少缓存的内存占用和提高缓存访问速度。这使得它在读写操作上有着卓
越的表现。
内存管理:Caffeine实现了自适应的内存管理,能够根据缓存的使用情况动态调整内存分配。它还支持
不同的缓存过期策略,有效控制内存使用。
过期策略:Caffeine支持多种缓存过期策略,如基于时间、基于大小、基于引用等,同时也允许用户自
定义过期策略。
简洁而强大的API:Caffeine提供了简洁而强大的API,使得缓存的创建和使用变得相对简单。
缓存加载器:Caffeine提供了CacheLoader接口,使得异步加载和刷新缓存项变得更容易。
监听器和事件:可以使用监听器跟踪缓存的变化,对缓存进行事件监听和处理。
3. Caffeine使用
3.1 手动创建
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.concurrent.TimeUnit;