Caffeine缓存简介说明
下文笔者讲述一个非常有用的本地缓存库Caffeine,目前已应用于Spring框架中
Caffeine缓存库简介
Caffeine 是 基于Java8的高性能 接近最佳的缓存库 Caffeine目前在Spring内部中有使用 Caffeine的GitHub地址为:github.com/ben-manes/caffeine
Caffeine缓存库的使用方法
//引入依赖 <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> </dependency> //使用方法 Logger log = LoggerFactory.getLogger(CaffeineTest.class); /** * 基本用法测试 */ @Test public void create() { // 创建缓存对象 Cache<String, String> cache = Caffeine.newBuilder().build(); // 存数据 cache.put("username", "java265.com"); // 取数据,不存在则返回null String username = cache.getIfPresent("username"); log.info("username: {}", username); // 取数据,不存在则去数据库查询 String age = cache.get("age", key -> { // 此处可以去数据库根据 key查询value return "11"; }); log.info("age: {}", age); }
Caffeine提供三种缓存驱逐策略
基于容量:设置缓存的数量上限 /** * 基于大小设置驱逐策略: * @throws InterruptedException e */ @Test public void evictByNum() throws InterruptedException { // 创建缓存大小上限为1 Cache<String, String> cache = Caffeine.newBuilder() // 设置缓存大小上限为 1 .maximumSize(1) .build(); // 存数据 cache.put("username1", "java265"); cache.put("username2", "test"); cache.put("username3", "最爱java"); log.info("start"); // 延迟10ms,给清理线程一点时间 Thread.sleep(100L); // 获取数据 log.info("gf1: " + cache.getIfPresent("username1")); log.info("gf2: " + cache.getIfPresent("username2")); log.info("gf3: " + cache.getIfPresent("username3")); } 基于时间:设置缓存的有效时间 /** * 基于时间设置驱逐策略 */ @Test public void evictByTime() throws InterruptedException { // 创建缓存对象 Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(Duration.ofSeconds(1))// 设置缓存有效期为 1 秒 .build(); // 存数据 cache.put("username", "java265"); // 获取数据 log.info("gf: " + cache.getIfPresent("username")); // 休眠一会儿 Thread.sleep(1200L); log.info("gf: " + cache.getIfPresent("username")); } 基于引用: 设置缓存为软引用或弱引用 利用GC来回收缓存数据 此种方式性能较差,不建议使用
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。