首页 > 其他分享 >Caffeine 缓存 动态的为每个值设置过期时间

Caffeine 缓存 动态的为每个值设置过期时间

时间:2025-01-16 14:01:00浏览次数:1  
标签:缓存 caffeineEntry 过期 Caffeine param value key import public

引入jar

 <!--本地缓存caffeine-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.checkerframework</groupId>
            <artifactId>checker-qual</artifactId>
            <version>3.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.checkerframework</groupId>
            <artifactId>checker-compat-qual</artifactId>
            <version>2.5.5</version>
        </dependency>

实现方法

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Expiry;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * Caffeine本地内存缓存操作
 */
@Component
public class CaffeineEntryCacheUtil {
    private Cache<String, CaffeineEntry> cache;

    /**
     * 初始化,创建可自定义控制过期时间的cache
     * l1是当前键剩余的时间
     *
//     * @param maximumSize
     */
    private CaffeineEntryCacheUtil() {
        Cache<String, CaffeineEntry> build = Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfter(new Expiry<String, CaffeineEntry>() {
                    @Override
                    public long expireAfterCreate(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l) {
                        return caffeineEntry.getExpireTime();
                    }

                    @Override
                    public long expireAfterUpdate(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l, @NonNegative long l1) {
                        return caffeineEntry.getExpireTime();
                    }

                    @Override
                    public long expireAfterRead(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l, @NonNegative long l1) {
                        if (caffeineEntry.isAccessFresh()) {
                            return caffeineEntry.getExpireTime();
                        }
                        return l1;
                    }
                }).build();
        this.cache = build;
    }

    /**
     * 加入缓存,默认过期时间24小时且读后不刷新
     *
     * @param key
     * @param value
     */
    public void putIntoCache(String key, Object value) {
        putIntoCache(key, value, 24, TimeUnit.HOURS, false);
    }

    /**
     * 加入缓存,可指定过期时间,默认不刷新 默认是分钟
     *
     * @param key
     * @param value
     * @param duration
     */
    public void putIntoCache(String key, Object value, long duration) {
        putIntoCache(key, value, duration, TimeUnit.MINUTES, false);
    }

    /**
     * 加入缓存,可指定过期时间、读后是否刷新
     *
     * @param key
     * @param value
     * @param duration
     * @param timeUnit
     * @param accessFresh
     */
    public void putIntoCache(String key, Object value, long duration, TimeUnit timeUnit, boolean accessFresh) {
        CaffeineEntry caffeineEntry = new CaffeineEntry();
        caffeineEntry.setKey(key);
        caffeineEntry.setValue(value);
        caffeineEntry.setExpireTime(timeUnit.toNanos(duration));
        caffeineEntry.setAccessFresh(accessFresh);
        cache.put(key, caffeineEntry);
    }

    /**
     * 获取缓存对象
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getCacheObject(String key, Class<T> clazz) {
        final Object result = getCacheObject(key);
        return Objects.nonNull(result) ? clazz.cast(result) : null;
    }

    /**
     * 获取缓存集合
     *
     * @param key
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> List<T> getCacheObjectList(String key, Class<T> clazz) {
        final Object result = getCacheObject(key);
        if (Objects.nonNull(result)) {
            Collection<?> collection = (Collection<?>) result;
            List<T> list = new ArrayList<>();
            collection.forEach(item -> list.add(clazz.cast(item)));
            return list;
        }
        return null;
    }

    /**
     * 获取基本缓存对象
     *
     * @param key
     * @return
     */
    public Object getCacheObject(String key) {
        final Object[] value = {null};
        Optional.ofNullable(cache.getIfPresent(key))
                .ifPresent(item -> {
                    value[0] = item.getValue();
                });
        return value[0];
    }

    /**
     * 删除单个缓存
     * @param key
     */
    public void deleteCacheObject(String key) {
        cache.invalidate(key); // 手动删除指定键的缓存项
    }

    /**
     * 删除所有缓存
     */
    public void deleteCacheObject() {
        cache.invalidateAll();
    }


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class CaffeineEntry {
        private String key;
        private Object value;
        private long expireTime;
        private boolean accessFresh;
    }
}

调用访问

   @Resource
    private CaffeineEntryCacheUtil caffeineEntryCacheUtil;

 public static void main(String[] args) {
         List<Class> cacheList = caffeineEntryCacheUtil.getCacheObject("name",List.class);
        if (cacheList != null && cacheList.size() != 0) {
            list=cacheList;
        } else {
            //实现查询数据
             list = null;
            //保存缓存
            caffeineEntryCacheUtil.putIntoCache("name",list);
        }
    }

 

标签:缓存,caffeineEntry,过期,Caffeine,param,value,key,import,public
From: https://www.cnblogs.com/aflyfly/p/18674843

相关文章

  • 【前端】前端需要知道的缓存知识总结
    引言......
  • Redis 缓存穿透、击穿、雪崩——解析与防范
    前言Redis是一个高性能的键值数据库,广泛应用于缓存、会话存储、实时数据分析等场景。然而,在高并发的环境下,Redis缓存可能会遇到缓存击穿、缓存穿透和缓存雪崩这三大问题。这些问题不仅影响系统的稳定性和性能,还经常出现在面试题中,值得我们深入了解和防范......
  • 【Varnish】:解决 Varnish 7.6 CDN 静态资源缓存失效问题
    项目场景:在一个使用Varnish作为反向代理的Web应用中,我们依赖CDN(内容分发网络)来缓存静态资源(如图片、CSS、JavaScript文件等),以提高全球用户的访问速度并减轻源站服务器的负载。然而,在实际运行中,我们遇到了一个问题:CDN缓存的静态资源全部一直回源,导致源站服务器负载过高,响应时间......
  • Java内存与缓存
    Java内存管理和缓存机制是构建高性能应用程序的关键要素。它们之间既有联系又有区别,理解这两者对于优化Java应用至关重要。Java内存模型Java内存模型(JMM)定义了线程如何以及何时可以看到其他线程修改过的共享变量的值,并且规定了所有线程在读取或写入共享变量时必须遵循的一......
  • 缓存提速+队列削峰+分库分表+读写分离
    项目背景由于访问量超出设计预期,12306网站在高峰期出现了一系列问题:页面打开缓慢查询和下单报错后台系统过载用户体验不佳根因分析请求高峰(类似于秒杀)响应迟缓  放票时高并发的下单集中在一起,形成请求高峰(类似于秒杀),请求导致订单/电子客票数据......
  • 基于javaPoet的缓存key优化实践
    作者:京东物流方志民一.背景在一次系统opsreview中,发现了一些服务配置了@Cacheable注解。@cacheable来源于springcache框架中,作用是使用aop的方式将数据库中的热数据缓存在redis/本地缓存中,代码如下:@Cacheable(value={"per"},key="#person.getId()"+"_"+"#person.get......
  • 帝国cms实现数据库查询缓存方法
    <?phpfunctiongetCache($key){$cacheFile='cache/'.md5($key).'.json';//使用md5生成唯一的文件名if(file_exists($cacheFile)){$data=json_decode(file_get_contents($cacheFile),true);//检查缓存是否过期(例如,设置过期时间为......
  • React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次
    基础概念Element对象与Fiber对象Element对象与Fiber对象Element对象定义React的Element对象是一个描述用户界面(UI)的普通JavaScript对象,通常由React.createElement或JSX语法生成。作用它是React应用中的一种描述UI的不可变数据结构。表示一个虚拟DOM......
  • 使用 Upstash 构建无服务器向量数据库与缓存系统的最佳实践
    技术背景介绍在构建现代智能应用时,开发者经常需要处理大量数据,包括向量嵌入、缓存管理和消息存储。然而传统数据库和内存存储的部署和运维往往带来复杂性。为了简化这些挑战,Upstash提供了基于HTTP的无服务器数据库和消息队列,其中包含两大关键产品:UpstashVector——......
  • 《深入理解Mybatis原理》Mybatis中的缓存实现原理
    一级缓存实现什么是一级缓存?为什么使用一级缓存?每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据......