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

打印 上一主题 下一主题

主题 825|帖子 825|积分 2490

引入jar
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-cache</artifactId>
  4.         </dependency>
  5.         <dependency>
  6.             <groupId>com.github.ben-manes.caffeine</groupId>
  7.             <artifactId>caffeine</artifactId>
  8.             <version>2.5.5</version>
  9.         </dependency>
  10.         <dependency>
  11.             <groupId>org.checkerframework</groupId>
  12.             <artifactId>checker-qual</artifactId>
  13.             <version>3.5.0</version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>org.checkerframework</groupId>
  17.             <artifactId>checker-compat-qual</artifactId>
  18.             <version>2.5.5</version>
  19.         </dependency>
复制代码
实现方法
  1. import com.github.benmanes.caffeine.cache.Cache;
  2. import com.github.benmanes.caffeine.cache.Caffeine;
  3. import com.github.benmanes.caffeine.cache.Expiry;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import org.checkerframework.checker.index.qual.NonNegative;
  8. import org.checkerframework.checker.nullness.qual.NonNull;
  9. import org.springframework.cache.annotation.EnableCaching;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.stereotype.Component;
  12. import java.util.*;
  13. import java.util.concurrent.TimeUnit;
  14. /**
  15. * Caffeine本地内存缓存操作
  16. */
  17. @Component
  18. public class CaffeineEntryCacheUtil {
  19.     private Cache<String, CaffeineEntry> cache;
  20.     /**
  21.      * 初始化,创建可自定义控制过期时间的cache
  22.      * l1是当前键剩余的时间
  23.      *
  24. //     * @param maximumSize
  25.      */
  26.     private CaffeineEntryCacheUtil() {
  27.         Cache<String, CaffeineEntry> build = Caffeine.newBuilder()
  28.                 .maximumSize(100)
  29.                 .expireAfter(new Expiry<String, CaffeineEntry>() {
  30.                     @Override
  31.                     public long expireAfterCreate(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l) {
  32.                         return caffeineEntry.getExpireTime();
  33.                     }
  34.                     @Override
  35.                     public long expireAfterUpdate(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l, @NonNegative long l1) {
  36.                         return caffeineEntry.getExpireTime();
  37.                     }
  38.                     @Override
  39.                     public long expireAfterRead(@NonNull String s, @NonNull CaffeineEntry caffeineEntry, long l, @NonNegative long l1) {
  40.                         if (caffeineEntry.isAccessFresh()) {
  41.                             return caffeineEntry.getExpireTime();
  42.                         }
  43.                         return l1;
  44.                     }
  45.                 }).build();
  46.         this.cache = build;
  47.     }
  48.     /**
  49.      * 加入缓存,默认过期时间24小时且读后不刷新
  50.      *
  51.      * @param key
  52.      * @param value
  53.      */
  54.     public void putIntoCache(String key, Object value) {
  55.         putIntoCache(key, value, 24, TimeUnit.HOURS, false);
  56.     }
  57.     /**
  58.      * 加入缓存,可指定过期时间,默认不刷新 默认是分钟
  59.      *
  60.      * @param key
  61.      * @param value
  62.      * @param duration
  63.      */
  64.     public void putIntoCache(String key, Object value, long duration) {
  65.         putIntoCache(key, value, duration, TimeUnit.MINUTES, false);
  66.     }
  67.     /**
  68.      * 加入缓存,可指定过期时间、读后是否刷新
  69.      *
  70.      * @param key
  71.      * @param value
  72.      * @param duration
  73.      * @param timeUnit
  74.      * @param accessFresh
  75.      */
  76.     public void putIntoCache(String key, Object value, long duration, TimeUnit timeUnit, boolean accessFresh) {
  77.         CaffeineEntry caffeineEntry = new CaffeineEntry();
  78.         caffeineEntry.setKey(key);
  79.         caffeineEntry.setValue(value);
  80.         caffeineEntry.setExpireTime(timeUnit.toNanos(duration));
  81.         caffeineEntry.setAccessFresh(accessFresh);
  82.         cache.put(key, caffeineEntry);
  83.     }
  84.     /**
  85.      * 获取缓存对象
  86.      *
  87.      * @param key
  88.      * @param clazz
  89.      * @param <T>
  90.      * @return
  91.      */
  92.     public <T> T getCacheObject(String key, Class<T> clazz) {
  93.         final Object result = getCacheObject(key);
  94.         return Objects.nonNull(result) ? clazz.cast(result) : null;
  95.     }
  96.     /**
  97.      * 获取缓存集合
  98.      *
  99.      * @param key
  100.      * @param clazz
  101.      * @param <T>
  102.      * @return
  103.      */
  104.     public <T> List<T> getCacheObjectList(String key, Class<T> clazz) {
  105.         final Object result = getCacheObject(key);
  106.         if (Objects.nonNull(result)) {
  107.             Collection<?> collection = (Collection<?>) result;
  108.             List<T> list = new ArrayList<>();
  109.             collection.forEach(item -> list.add(clazz.cast(item)));
  110.             return list;
  111.         }
  112.         return null;
  113.     }
  114.     /**
  115.      * 获取基本缓存对象
  116.      *
  117.      * @param key
  118.      * @return
  119.      */
  120.     public Object getCacheObject(String key) {
  121.         final Object[] value = {null};
  122.         Optional.ofNullable(cache.getIfPresent(key))
  123.                 .ifPresent(item -> {
  124.                     value[0] = item.getValue();
  125.                 });
  126.         return value[0];
  127.     }
  128.     /**
  129.      * 删除单个缓存
  130.      * @param key
  131.      */
  132.     public void deleteCacheObject(String key) {
  133.         cache.invalidate(key); // 手动删除指定键的缓存项
  134.     }
  135.     /**
  136.      * 删除所有缓存
  137.      */
  138.     public void deleteCacheObject() {
  139.         cache.invalidateAll();
  140.     }
  141.     @Data
  142.     @AllArgsConstructor
  143.     @NoArgsConstructor
  144.     static class CaffeineEntry {
  145.         private String key;
  146.         private Object value;
  147.         private long expireTime;
  148.         private boolean accessFresh;
  149.     }
  150. }
复制代码
调用访问
  1.    @Resource
  2.     private CaffeineEntryCacheUtil caffeineEntryCacheUtil;
  3. public static void main(String[] args) {
  4.          List<Class> cacheList = caffeineEntryCacheUtil.getCacheObject("name",List.class);
  5.         if (cacheList != null && cacheList.size() != 0) {
  6.             list=cacheList;
  7.         } else {
  8.             //实现查询数据
  9.              list = null;
  10.             //保存缓存
  11.             caffeineEntryCacheUtil.putIntoCache("name",list);
  12.         }
  13.     }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表