com.ideaaedi.extspringcache.annotation.Caffeine Maven / Gradle / Ivy
package com.ideaaedi.extspringcache.annotation;
import com.github.benmanes.caffeine.cache.Weigher;
import com.ideaaedi.extspringcache.enums.CaffeineExpireStrategyEnum;
import com.ideaaedi.extspringcache.enums.CaffeineKeyQuoteTypeEnum;
import com.ideaaedi.extspringcache.enums.CaffeineValueQuoteTypeEnum;
import java.time.temporal.ChronoUnit;
/**
* Caffeine缓存相关信息
*
* @author JustryDeng
* @since 2020/11/4 14:50:29
*/
public @interface Caffeine {
/* --------------------------------------- 常用配置 --------------------------------------- */
/**
* caffeine缓存的初始化容量大小
*
* 注: caffeine存数据时,其实就是用的一种自定义的Map子类实现存储的,所以初始化容量即为Map的初始化容量大小
注: 所以设置initialCapacity时以2的n次幂最佳
*/
int initialCapacity() default 128;
/**
* caffeine缓存条目(注:可理解为Map键值对)的个数上限
*
* 注: 若 maximumSize > 0, 同时maximumWeight > 0, 那么默认选择走maximumSize
*
* P.S. 超过的话,在刷新缓存时将根据策略定位并淘汰性价比低的键值对
*/
long maximumSize() default -1;
/** 当前键值对的过期时间 */
int expireTime() default -1;
/** {@link Caffeine#expireTime}的单位timeUnit */
ChronoUnit timeUnit() default ChronoUnit.SECONDS;
/** 缓存过期策略 */
CaffeineExpireStrategyEnum expireStrategy() default CaffeineExpireStrategyEnum.EXPIRE_AFTER_WRITE;
/* --------------------------------------- 不常用配置 --------------------------------------- */
/** 是否打开统计功能 */
boolean recordStats() default false;
/** 设置key对象的引用类型 */
CaffeineKeyQuoteTypeEnum keyQuoteType() default CaffeineKeyQuoteTypeEnum.DEFAULT;
/** 设置value对象的引用类型 */
CaffeineValueQuoteTypeEnum valueQuoteType() default CaffeineValueQuoteTypeEnum.DEFAULT;
/*
* 何时启用maximumWeight?
* 当maximumSize <= 0,同时maximumWeight > 0时。
*
* check: 当启用maximumWeight时,
* 需要保证: 从容器中能获取到bean-name为${writer4MaximumWeight}的com.github.benmanes.caffeine.cache.Weigher
*/
/**
* caffeine缓存条目(注:可理解为Map键值对)的权重上限。
*
* 注: 若 maximumSize > 0, 同时maximumWeight > 0, 那么默认选择走maximumSize
*
* P.S. 超过的话,在刷新缓存时会将“重量”超过此值的键值对淘汰
*
* @see Caffeine#weigher4MaximumWeight
*/
long maximumWeight() default -1;
/**
* key-value的称重器, "重量"超过maximumWeight的键值对将被淘汰
*
* 注1:虽然命中了缓存,但是因为该缓存被淘汰了,所以请求还是会进入方法
* 注2:{@link Weigher#weigh(Object, Object)}的返回值即为重量值
* 注3:值应该填{@link com.github.benmanes.caffeine.cache.Weigher}的spring-bean name
*
*/
String weigher4MaximumWeight() default "";
/*
* 何时启用refreshAfterWrite?
* 当refreshAfterWrite >0 时。
*
* check: 当启用refreshAfterWrite时,
* 需要保证: 从容器中能获取到bean-name为${cacheLoader4Refresh}的com.github.benmanes.caffeine.cache.CacheLoader实例
*/
/**
* 刷新缓存的时间间隔
*
* 若refreshAfterWrite <= 0
,则表示不刷新
*/
int refreshAfterWrite() default -1;
/** {@link Caffeine#refreshAfterWrite}的单位 */
ChronoUnit timeUnit4Refresh() default ChronoUnit.SECONDS;
/**
* 缓存加载器, 在刷新缓存时,需要用到缓存加载器
*
* 注:当caffeine首次没有命中缓冲时,会试着用CacheLoader#load再去加载缓存,如果能加载到(即:返回值不为null),那么caffeine就会刷新缓存值,
* 并认为命中了缓存。如果没有加载到,那么caffeine才最终认定为没有加载到缓存,进而进入业务方法内部。
*
*
* 值应该填{@link com.github.benmanes.caffeine.cache.CacheLoader}的spring-bean name
*
*/
String cacheLoader4Refresh() default "";
}