Caffeine缓存

Caffeine缓存

Caffeine缓存

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine

设置SpringBoot父工程时,可直接添加依赖:

        <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", "aaaa");

        // 取数据,不存在则返回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("gf1", "柳岩");
        cache.put("gf2", "范冰冰");
        cache.put("gf3", "迪丽热巴");
        log.info("start");
        // 延迟10ms,给清理线程一点时间
        Thread.sleep(100L);
        // 获取数据
        log.info("gf1: " + cache.getIfPresent("gf1"));
        log.info("gf2: " + cache.getIfPresent("gf2"));
        log.info("gf3: " + cache.getIfPresent("gf3"));
    }
  • 基于时间:设置缓存的有效时间
    /**
     * 基于时间设置驱逐策略
     */
    @Test
    public void evictByTime() throws InterruptedException {
        // 创建缓存对象
        Cache<String, String> cache = Caffeine.newBuilder()
                .expireAfterWrite(Duration.ofSeconds(1))// 设置缓存有效期为 1 秒
                .build();
        // 存数据
        cache.put("gf", "柳岩");
        // 获取数据
        log.info("gf: " + cache.getIfPresent("gf"));
        // 休眠一会儿
        Thread.sleep(1200L);
        log.info("gf: " + cache.getIfPresent("gf"));
    }
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值