Caffeine本地缓存

Caffeine本地缓存

0.caffeine适用场景

适用场景
因为Caffeine cache是类似于Guava cache的一种内存缓存,所以适合单机的数据缓存;因为存储在内存的,没有持久化,因此适合一些短期或者启动以及结果信息的短暂缓存当涉及到多机多服务的缓存时候,属于分布式缓存的范畴,可以使用Redis、memcached等分布式的缓存组件。

1.什么是本地缓存

Redis是一个运行在机器上面的服务,而本地缓存就是你jar包里面的一部分,Redis缓存是需要通过网络连接去获取数据的,而本地缓存就是在你的java项目里面的jvm内存中的数据。

2.如何使用Caffeine本地缓存框架
  • 引入依赖
				<dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
  • 注入Bean到IOC容器
@Configuration
public class CaffeineConfig {
    @Bean
    public Cache<Object,Object> Cache(){
        Cache<Object, Object> caffeineCache = Caffeine.newBuilder()
                .initialCapacity(50)
                .maximumSize(100)
                .build();
        return caffeineCache;
    };
}
3.介绍Caffeine
1.Caffeine的缓存淘汰策略

Caffeine淘汰算法:使用基于W-TinyLFU算法,实现几乎完美的命中率;

  1. FIFO:实现简单,类似于队列,先进先出,因此缓存命中率不是很高。

  2. LRU:最近最久未使用算法(Least Recently Used)如果一个数据在一段时间内没有被访问,那么我们认为后面被访问的概率也很小。当我们添加新数据的时候,会把新数据放到队尾(假设新数据最大概率被再次访问),当我们长度到达阈值需要淘汰数据的时候,会从队首进行淘汰。这种算法造成缓存污染的概率会大些,比如现在有一些较少数据突增流量,但是后面不在访问,那么此时已经将热数据淘汰出去了,而缓存的数据后面也几乎不被访问。

  3. LFU:最近最少使用算法(Least Frequently Used)如果一个数据在一段时间内访问的频率很小,那么认为后面被访问的几率也很小,所以淘汰访问频率最少的数据;该算法可以处理LRU因为冷数据突增带来的缓存污染问题。存在的问题是数据访问模式如果改变,这种算法命中率会下降,并且需要额外的空间存储信息频率。

  4. W-TinyLFU:记录了近期访问记录的频率信息,不满足的记录不会进入到缓存。使用Count-Min Sketch算法记录访问记录的频率信息。依靠衰减操作,来尽可能的支持数据访问模式的变化。

  • 代码示例
  1. 基于大小的缓存淘汰策略(基于缓存项数目):

    Cache<String, String> cache = Caffeine.newBuilder()
            .maximumSize(100) // 设置最大缓存项数目为100
            .build();
    

    在这个示例中,通过maximumSize()方法指定了缓存的最大项数。当缓存项的数量达到最大值时,最旧的缓存项将被淘汰。

  2. 基于权重的缓存淘汰策略(基于缓存项的权重):

    Cache<String, String> cache = Caffeine.newBuilder()
            .maximumWeight(1000) // 设置最大缓存权重为1000
            .weigher((key, value) -> value.length()) // 指定缓存项的权重计算方法
            .build();
    

    在这个示例中,通过maximumWeight()方法设置了缓存的最大权重。然后,通过weigher()方法指定了计算缓存项权重的方法,该方法返回缓存项的权重。当缓存项的权重总和达到最大权重时,最旧的缓存项将被淘汰。

  3. 定时过期的缓存淘汰策略(基于缓存项的过期时间):

    Cache<String, String> cache = Caffeine.newBuilder()
            .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存项的写入后过期时间为1分钟
            .build();
    

    在这个示例中,通过expireAfterWrite()方法设置了缓存项的写入后过期时间。当缓存项距离上一次写入超过指定的时间后,该缓存项将被淘汰。

  • 思考问题

​ 我如果不指定最大缓存数目,那么默认的缓存淘汰策略是什么?
在这里插入图片描述

在这里插入图片描述

2.Caffeine可以给某个key设置过期时间

是的,Caffeine中的缓存Cache可以设置某个key的过期时间。

Caffeine是一个Java缓存库,提供了一种高效的内存缓存解决方案。它提供了灵活的配置选项,并支持在缓存中设置key的过期时间。

以下是设置key的过期时间的示例代码:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

public class Example {
    public static void main(String[] args) {
        // 创建一个缓存实例
        Cache<String, String> cache = Caffeine.newBuilder()
                .build();

        // 设置某个key的过期时间
        String key = "exampleKey";
        String value = "exampleValue";
        cache.put(key, value);

        // 设置key的过期时间为10秒
        cache.put(key, value, cache.ticker().read() + 10_000);

        // 获取key对应的value
        String result = cache.getIfPresent(key);
        System.out.println(result);

        // 等待10秒后
        try {
            Thread.sleep(10_000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 获取key对应的value,此时已过期,返回null
        result = cache.getIfPresent(key);
        System.out.println(result);
    }
}

在上述示例中,我们使用Caffeine创建了一个缓存实例,然后使用put方法设置某个key的value,并使用put方法的重载版本设置对应的过期时间,即cache.put(key, value, cache.ticker().read() + 10_000)

在设置过期时间时,需要使用当前时间加上过期时间的毫秒数,通过cache.ticker().read()获取当前时间戳。

通过调用getIfPresent方法,可以获取某个key对应的value。在示例中,我们首先获取key对应的value,然后等待过期时间10秒后,再次获取key对应的value,已经过期,返回null。

这样,我们可以使用Caffeine的缓存实现具备了设置key过期时间的功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值