CaffeineCache自定义缓存时间

news/2025/2/26 5:27:23

文章目录

  • 1、POM文件依赖
  • 2、声明缓存
  • 3、缓存使用
  • 4、测试缓存
  • 5、自定义缓存过期时间
  • 6、测试自定义超时时间

1、POM文件依赖

<dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>3.1.0</version>
        </dependency>

2、声明缓存

@Slf4j
public class CaffeineCacheUtils {

    /**
     * 声明缓存对象
     */
    private static final Cache<String, Object> CACHE = Caffeine.newBuilder()
            // 当key和value都没有引用时驱逐缓存
            .weakKeys()
            .weakValues()
            // 最大容量
            .maximumSize(10_000)
            // 固定存活时间24小时
            .expireAfterWrite(2 * 60 * 60 * 1000L, TimeUnit.MILLISECONDS)
            .build()
            // 构建Caffeine缓存
            ;
 }

3、缓存使用

/**
     * 添加缓存
     *
     * @param key   key值
     * @param value value值
     */
    public static void put(String key, Object value) {
        CACHE.put(key, value);
    }

    /**
     * 获取缓存对象
     *
     * @param key key值
     * @return 返回value值
     */
    public static Object get(String key) {
        return CACHE.getIfPresent(key);
    }

4、测试缓存

@Test
    public void testCache() {
        CaffeineCacheUtils.put("key", "value");
        Object value = CaffeineCacheUtils.get("key");
        log.info("value={}", value);
    }

5、自定义缓存过期时间

expireAfterWrite是指定一个固定的过期时间,如果想要根据不同的key值自己指定过期时间,可以按照下面的方法来实现。

声明一个缓存value值holder对象

@Data
public class CacheValueHolder implements Serializable {

    @Serial
    private static final long serialVersionUID = 1398783661313031605L;

    private Object value;
    private TimeUnit timeUnit;
    private long expire;

}

创建缓存容器

/**
     * 声明缓存对象
     */
    private static final Cache<String, CacheValueHolder> CACHE = Caffeine.newBuilder()
            // 当key和value都没有引用时驱逐缓存
            .weakKeys()
            .weakValues()
            // 最大容量
            .maximumSize(10_000)
            .expireAfter(new Expiry<String, CacheValueHolder>() {

                @Override
                public long expireAfterCreate(String key, CacheValueHolder valueHolder, long currentTime) {
                    log.info("创建缓存对象,key={},value={},currentTime={}", key, JSON.toJSONString(valueHolder), currentTime);
                    return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire());
                }

                @Override
                public long expireAfterUpdate(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) {
                    log.info("更新缓存对象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration);
                    return valueHolder.getTimeUnit().toNanos(valueHolder.getExpire());
                }

                @Override
                public long expireAfterRead(String key, CacheValueHolder valueHolder, long currentTime, @NonNegative long currentDuration) {
                    log.info("读取缓存对象,key={},value={},currentTime={},currentDuration={}", key, JSON.toJSONString(valueHolder), currentTime, currentDuration);
                    return currentDuration;
                }
            })
            // 如果缓存不存在,则同步查询事业部产品列表,同时加入缓存
            .build()
            // 构建Caffeine缓存
            ;

修改缓存使用方法

/**
     * 添加缓存
     *
     * @param key      key值
     * @param value    value值
     * @param expire   过期时间
     * @param timeUnit 时间类型
     */
    public static void put(String key, Object value, long expire, TimeUnit timeUnit) {
        CacheValueHolder valueHolder = new CacheValueHolder();
        valueHolder.setValue(value);
        valueHolder.setExpire(expire);
        valueHolder.setTimeUnit(timeUnit);
        CACHE.put(key, valueHolder);
    }

    /**
     * 添加缓存
     *
     * @param key   key值
     * @param value value值
     */
    public static void put(String key, Object value) {
        // 默认缓存存在时间为1000毫秒
        put(key, value, 1000, TimeUnit.MILLISECONDS);
    }

    /**
     * 获取缓存对象
     *
     * @param key key值
     * @return 返回value值
     */
    public static Object get(String key) {
        CacheValueHolder valueHolder = CACHE.getIfPresent(key);
        if (Objects.isNull(valueHolder)) {
            return null;
        }

        return valueHolder.getValue();
    }

6、测试自定义超时时间

@Test
    public void testCache() throws InterruptedException {
        CaffeineCacheUtils.put("key1", "value1", 1000L, TimeUnit.MILLISECONDS);
        CaffeineCacheUtils.put("key2", "value2", 2000L, TimeUnit.MILLISECONDS);
        Object value1 = CaffeineCacheUtils.get("key1");
        Object value2 = CaffeineCacheUtils.get("key2");
        log.info("value1={}", value1);
        log.info("value2={}", value2);

        TimeUnit.MILLISECONDS.sleep(1000L);
        Object value11 = CaffeineCacheUtils.get("key1");
        Object value22 = CaffeineCacheUtils.get("key2");
        log.info("value1={}", value11);
        log.info("value2={}", value22);

    }

方法运行后日志为:

23:44:21.398 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 创建缓存对象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165196876700
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 创建缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165240503500
23:44:21.401 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key1,value={"expire":1000,"timeUnit":"MILLISECONDS","value":"value1"},currentTime=8165240686100,currentDuration=956190600
23:44:21.403 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8165242670700,currentDuration=1997832800
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=value1
23:44:21.403 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2
23:44:22.410 [main] INFO com.summer.toolkit.util.CaffeineCacheUtils - 读取缓存对象,key=key2,value={"expire":2000,"timeUnit":"MILLISECONDS","value":"value2"},currentTime=8166249659500,currentDuration=990844000
23:44:22.411 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value1=null
23:44:22.412 [main] INFO com.summer.toolkit.service.CaffeineCacheUtilsTest - value2=value2

可以看到同时放入缓存容器中的两个缓存,一个1000毫秒的过期时间,一个2000毫秒的过期时间,当刚放入时都可以获取到,等待1000毫秒后,只有第二个缓存可以获取到,第一个缓存对象已经过期获取不到,实现了用户自定义缓存对象过期时间。


http://www.niftyadmin.cn/n/5868041.html

相关文章

基于Matlab实现汽车远近光灯识别的详细步骤及代码示例

以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例&#xff0c;主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理&#xff1a;包括读取图像、灰度化、去噪等操作&#xff0c;以提高后续处理的准确性。边缘检测&#xff1a;找出图像中的边缘信息…

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序&#xff1a; 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…

C/C++ | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…

Linux中常见命令使用

Linux命令&#xff0c;本质是一个二进制可执行程序&#xff0c;与Windows系统中的.exe文件是一个意思 ls -l -l看到的信息&#xff0c;开始是d&#xff0c;说明是文件夹&#xff0c;开始是-&#xff0c;则是文件w -h让文件大小更人性化的显示 文件操作命令 touch 创建文件…

将DeepSeek接入vscode的N种方法

接入deepseek方法一:cline 步骤1:安装 Visual Studio Code 后,左侧导航栏上点击扩展。 步骤2:搜索 cline,找到插件后点击安装。 步骤3:在大模型下拉菜单中找到deep seek,然后下面的输入框输入你在deepseek申请的api key,就可以用了 让deepseek给我写了一首关于天气的…

音乐游戏Drummania(GITADORA)模拟器

文章目录 &#xff08;一&#xff09;Drummania和GITADORA&#xff08;1.1&#xff09;基本情况&#xff08;1.2&#xff09;机体 &#xff08;二&#xff09;模拟器&#xff08;2.1&#xff09;主程序&#xff08;2.2&#xff09;模拟器主题 &#xff08;三&#xff09;曲谱文…

AIoT是什么?关键技术及应用

一.AIoT定义 AIoT 概念是在 2017 年正式向公开市场提出的。2017 年 11 月 28 日&#xff0c;在由光际资本、36 氪、特斯联联合主办的 “万物智能.新纪元 AIoT 未来峰会” 上&#xff0c;与会专家及行业嘉宾首次正式向公开市场提出 AIoT 概念。AIoT 即人工智能物联网&#xff0c…

网页五子棋——项目部署

目录 安装 openjdk 安装 MySQL 创建数据库和数据表 修改 WebSocket 建立连接的 url 上传项目 在项目实现完成后&#xff0c;我们就可以将项目部署到云服务器上&#xff08;在这里使用的是 Ubuntu&#xff09; 我们先在服务器上安装 jdk、mysql 等 更新软件包&#xff…