首页 > 数据库 > 数据库开发技术 > 本地缓存Caffeine框架的学习笔记
Caffeine是一个高性能的Java本地缓存框架,它采用了W-TinyLFU算法,结合了LRU和LFU算法的优点,实现了缓存高命中率和内存低消耗。Caffeine的设计理念是尽可能地高效,它通过一些巧妙的算法,确保最常访问的数据始终可用,咱们先来看一下Caffeine的特点。
Caffeine的主要特点包括:
Caffeine的使用相对简单,API与Guava Cache一致,可以快速集成到项目中。例如,创建一个简单的Caffeine缓存实例,可以按照以下方式进行配置和使用:
Cache<String, String> cache = Caffeine.newBuilder()
.maximumSize(10000) // 设置最大缓存大小
.expireAfterWrite(5, TimeUnit.MINUTES) // 设置写入后5分钟过期
.build();
cache.put("key", "value"); // 存入缓存
String value = cache.getIfPresent("key"); // 从缓存中获取数据
在实际应用中,Caffeine可以帮助提升应用程序的性能和响应速度,降低系统的负载和延迟。通过合理配置和使用Caffeine,可以充分发挥其高性能特性。
在进行缓存逐出策略选择时,Caffeine的W-TinyLFU算法相比其他算法有哪些优势和劣势?
总结一下W-TinyLFU算法的优势如下:
优势:
有优就有劣,需要注意以下几点:
劣势:
总而言之,言而总之,W-TinyLFU算法在提高缓存命中率和适应不同访问模式方面表现出色,但同时也带来了算法复杂性、内存使用和可能的性能开销等劣势。开发者在选择缓存逐出策略时需要根据具体的应用场景和性能要求来权衡这些优势和劣势。
在实际应用中,对Caffeine的W-TinyLFU算法进行参数调整以达到最佳性能,通常需要根据具体的业务场景和需求来进行。以下是一个简单的业务场景案例,以及如何使用Caffeine构建缓存并进行参数调整的示例代码。
假设我们正在开发一个新闻推荐系统,需要缓存用户的新闻浏览记录。这个系统有以下特点:
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.lang.ref.WeakReference;
Caffeine<Object, Object> builder = Caffeine.newBuilder();
// 设置最大缓存项数量
int maxCacheSize = 10000; // 假设我们设置最大缓存项为10000条记录
builder.maximumSize(maxCacheSize);
// 设置写入后10分钟过期
builder.expireAfterWrite(10, TimeUnit.MINUTES);
// 使用弱引用存储键和值
builder.weakKeys().weakValues();
// 缓存项移除监听器
builder.removalListener((key, value, cause) -> {
// 这里可以执行一些清理操作,比如记录日志
System.out.println("Cache entry removed: " + key + ", " + value);
});
// 构建缓存
Cache<Object, Object> newsRecordCache = builder.build();
// 使用缓存
newsRecordCache.put(“weige123", new WeakReference<>(new NewsRecord("news456")));
NewsRecord record = ((WeakReference<NewsRecord>) newsRecordCache.getIfPresent("weige123")).get();
if (record != null) {
// 处理新闻记录
}
maximumSize:设置缓存的最大容量,超过这个容量后,将根据W-TinyLFU算法逐出最少使用的缓存项。expireAfterWrite:设置写入后过期时间,过期的缓存项将被自动逐出。weakKeys 和 weakValues:使用弱引用存储键和值,使得长时间未访问的缓存项可以被垃圾回收器回收。removalListener:注册一个监听器,在缓存项被逐出时执行自定义逻辑,比如记录日志或更新数据库。通过参数调整,咱们可以针对新闻推荐系统的业务需求,构建一个高效且具有自动清理机制的缓存系统。当然,具体的参数值(如maxCacheSize和过期时间)应该根据实际的业务场景和性能测试结果来确定。
如果我想监控缓存的性能,Caffeine提供了哪些监控工具或方法?
Caffeine提供了一些工具和方法来帮助监控缓存的性能:
recordStats()方法,你可以获取到缓存的各种统计数据,如命中率、请求次数、加载成功次数等。这些数据对于了解缓存的性能和状态非常有用。例如:Cache<String, String> cache = Caffeine.newBuilder()
.recordStats()
.build();
System.out.println(cache.stats());
RemovalListener<String, String> listener = (key, value, cause) ->
System.out.println("被移除的键:" + key + ", 原因:" + cause);
Cache<String, String> cache = Caffeine.newBuilder()
.removalListener(listener)
.build();
Cache<String, String> cache = Caffeine.newBuilder()
.maximumWeight(10000)
.weigher((key, value) -> value.length())
.build();
@RestController
@RequestMapping("monitor/caffeine")
public class MonitorCaffeineController {
@Resource
private CacheManager caffeineCacheManager;
@GetMapping("cacheNames")
public Collection<String> cacheNames() {
return caffeineCacheManager.getCacheNames();
}
@GetMapping("stats")
public Map<String, Object> stats(@RequestParam String cacheName) {
CaffeineCache caffeineCache = (CaffeineCache) caffeineCacheManager.getCache(cacheName);
CacheStats stats = CacheStats.empty();
if (caffeineCache != null) {
stats = caffeineCache.getNativeCache().stats();
}
// ...构建返回的监控数据
}
}
除了以上这些,你还可以注册一个淘汰监听器来监听缓存项被淘汰的事件,并执行一些自定义逻辑,例如记录日志等等。这些工具和方法,可以让咱们有效地监控Caffeine缓存的性能,并根据收集到的数据进行适当的调优。
更多关于Caffeine框架的内容还是需要到官方文档去学习,V 哥抛砖引玉,这么好用的缓存框架不了解一下,甚是可惜啊,你觉得呢?

V哥原创技术文章发布于 CSDN技术社区,欢迎关注【威哥爱编程】
- END -

原文作者:Java架构栈;如有侵权,请联系管理员删除。