SpringBoot 使用 Caffeine 本地缓存 带过期key

Tips:过期key时使用Caffeine的expireAfterWrite方法实现,所以一个过期key就对应一个cache 

Maven项目导入依赖

<!-- cache 缓存 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
 	<version>2.5.14</version>
</dependency>

<!-- cache 缓存实现 -->
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
	<version>2.9.3</version>
</dependency>

创建配置类

import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author lxb
 * @create 2023/6/8 14:42
 **/
@Configuration
public class CaffeineCacheConfig {


    @Bean
    public CaffeineCacheManager cacheManager() {
        CaffeineCacheManager  caffeineCacheManager = new CaffeineCacheManager();
        return caffeineCacheManager;
    }

}

封装工具类是按照redis工具类封装的

@Component
public class CaffeineRepository {

    @Autowired
    private CaffeineCacheManager cacheManager;
    // 默认不过期cache
    static final String defaultCacheName = "ordinary";
    // 过期默认cache
    static final String defaultExpire = "expire";
    // 不过期
    static final long defaultTimeout = -1;
    // 记录过期可以的添加时间使用
    static final String expireKey = ":time";

    /***
     * 获取Cache 没有就创建
     * @param cacheName
     * @return
     */
    public Cache createCache(String cacheName,long timeout){
        if (!isCache(cacheName)) {
            cacheManager.registerCustomCache(cacheName,caffeineCacheBuilder(timeout).build());
        }
        return cacheManager.getCache(cacheName);
    }

    
    public Cache getCache(String cacheName){
        return cacheManager.getCache(cacheName);
    }

    /***
     * 判断Cache是否存在
     * @param cacheName
     * @return
     */
    public boolean isCache(String cacheName){
        Collection<String> list = cacheManager.getCacheNames();
        if (!list.isEmpty()) {
            return list.stream().anyMatch(d ->d.equals(cacheName));
        }
        return false;
    }

    /***
     * 判断cache中的key是否存在
     * @param cacheName
     * @param key
     * @return
     */
    public boolean exist(String cacheName,String key){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            CaffeineCache caffeine = (CaffeineCache ) cache;
            return caffeine.getNativeCache().asMap().keySet().stream().anyMatch(d ->d.equals(key));

        }
        return false;
    }

    /***
     * 判断默认cache中是否有key
     * @param key
     * @return
     */
    public boolean exist(String key){
        return exist(defaultCacheName,key);
    }

    /***
     * 保存普通key
     * @param key
     * @param value
     */
    public void set(String key,Object value){
        set(defaultCacheName,key,value);
    }

    /**
     * 保存其他的key
     * @param cacheName
     * @param key
     * @param value
     */
    public void set(String cacheName,String key,Object value){
        Cache cache = createCache(cacheName,defaultTimeout);
        if (cache!=null) {
            cache.put(key,value);
        }
    }

    /***
     * 获取默认cache中key的值
     * @param key
     * @return Object
     */
    public Object get(String key){
        return get(defaultCacheName,key);
    }

    public Object get(String cacheName,String key){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            if (cache!=null) {
                Cache.ValueWrapper value = cache.get(key);
                if (value!=null){
                    return value.get();
                }
            }
        }
        return null;
    }

    /***
     * 获获取默认cache中key的值
     * @param key
     * @param type 返回的类型
     * @param <T>
     * @return
     */
    public <T> T get(String key,Class<T> type){
        return get(defaultCacheName,key,type);
    }

    /***
     * 获取指定cache中key的值
     * @param cacheName
     * @param key
     * @param type 返回的类型
     * @param <T>
     * @return
     */
    public <T> T get(String cacheName,String key,Class<T> type){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            if (exist(cacheName,key)) {
                return cache.get(key,type);
            }
        }
        return null;
    }

    /***
     * 保存没过期的key
     * @param key
     * @param value
     */
    public void setExpire(String key,Object value,long time){
        setExpire(defaultExpire,key,value,time);
    }

    /***
     * 设置过期的key
     * @param cacheName 不同过期时间要使用不同的cache
     * @param key key
     * @param value 值
     * @param time 过期时间(单位是秒)
     */
    public void setExpire(String cacheName,String key,Object value,long time){
        Cache cache = createCache(cacheName,time);
        if (cache!=null) {
            cache.put(key+expireKey,System.currentTimeMillis());
            cache.put(key,value);
        }
    }

    public void setExpire(String cacheName,String key,long time){
        Cache cache = createCache(cacheName,time);
        if (cache!=null) {
            cache.put(key+expireKey,System.currentTimeMillis());
            cache.put(key,true);
        }


    }

    public Object getExpire(String key){
        return getExpire(defaultExpire,key);
    }

    public Object getExpire(String cacheName,String key){
        return get(cacheName,key);
    }


    /***
     * 获取秒过期的key
     * @param key
     * @param type 放回的类型
     * @param <T>
     * @return
     */
    public <T> T getExpire(String key,Class<T> type){
        return getExpire(defaultExpire,key,type);
    }

    public <T> T getExpire(String cacheName,String key,Class<T> type){
        return  get(cacheName,key,type);
    }

    /***
     * 删除普通key
     * @param key
     * @return
     */
    public boolean del(String key){
        return del(defaultCacheName,key);
    }

    /***
     * 删除cache中的key
     * @param cacheName
     * @param key
     * @return
     */
    public boolean del(String cacheName,String key){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            if (cache!=null) {
                return cache.evictIfPresent(key);
            }
        }
        return false;
    }

    /***
     * 删除 默认过期cache中的key
     * @param key
     * @return
     */
    public boolean delExpire(String key){
        return del(defaultExpire,key);
    }

    /***
     * 获取map中的一个key的值
     * @param key
     * @param hashKey
     * @return
     */
    public Object getHashValues(String key, String hashKey) {
        Map map = get(key, Map.class);
        if (map!=null) {
            return map.get(hashKey);
        }
        return null;
    }

    /***
     * 获取map中的一个key的值
     * @param key 缓存key
     * @param hashKey map中的key
     * @param type 放回类型
     * @param <T> 放回类型
     * @return
     */
    public <T> T getHashValues(String key, String hashKey,Class<T> type) {
        Map map = get(key, Map.class);
        if (map!=null) {
            Object value = map.get(hashKey);
            if (type!=null && type.isInstance(value)) {
                return (T) value;
            }
        }
        return null;
    }

    public void putHashValue (String key, String hashKey, Object hashValue){
        Map map = get(key, Map.class);
        if (map == null) {
            map = new HashMap<>();
        }
        map.put(hashKey,hashValue);
        set(key,map);
    }

    /**
     * 获取key的过期时间 (单位是秒)
     * @param cacheName
     * @param key
     * @return
     */
    public long getExpireTime (String cacheName,String key){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            CaffeineCache caffeine = (CaffeineCache ) cache;
            try {
                long time = caffeine.getNativeCache().policy().expireAfterWrite().get().getExpiresAfter(TimeUnit.MILLISECONDS);
                long depositTime = cache.get(key+expireKey,Long.class);
                return TimeUnit.MILLISECONDS.toSeconds((depositTime + time) - System.currentTimeMillis());
            }catch (Exception e) {
            }
        }
        return -1L;
    }

    /***
     * 获取cache中的所有的key
     * @param cacheName
     * @return
     */
    public Set<String> getAllKeys(String cacheName){
        if (isCache(cacheName)) {
            Cache cache = getCache(cacheName);
            CaffeineCache caffeine = (CaffeineCache ) cache;
            Set<Object> set = caffeine.getNativeCache().asMap().keySet();
            if (!set.isEmpty()) {
                return set.stream().map(Object::toString).collect(Collectors.toSet());
            }
        }
        return Sets.newHashSet();
    }

    /***
     * 获取cache中以keyPatten开头的所有key
     * @param cacheName
     * @param keyPatten
     * @return
     */
    public Set<String> getKeys(String cacheName,String keyPatten){
        Set<String> set = getAllKeys(cacheName);
        if (set!=null && !set.isEmpty()) {
           return set.stream().filter(d ->d.contains(keyPatten)).collect(Collectors.toSet());
        }
        return set;
    }

    /***
     * 获取默认cache中以keyPatten开头的所有key
     * @param keyPatten
     * @return
     */
    public Set<String> getKeys(String keyPatten){
        return getKeys(defaultCacheName,keyPatten);
    }

    /***
     * 配置cache
     * @param timeout 过期时间(单位是秒)
     * @return
     */
    private Caffeine< Object, Object > caffeineCacheBuilder(long timeout) {
        if (timeout>0) {
            return Caffeine.newBuilder()
                    .initialCapacity(10)
                    .maximumSize(50)
                    .expireAfterWrite(timeout, TimeUnit.SECONDS);
        } else {
            return Caffeine.newBuilder()
                    .initialCapacity(100)
                    .maximumSize(500);
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值