本地缓存之王,Caffeine保姆级教程
若所有缓存的权重加起来总权重就会淘汰权重小的缓存 .maximumWeight(100) .weigher((WeigherInteger,key=''user'+#userId',当方法返回null时,sync表示在读取不存在/已驱逐的key时,会报错 *查询用户信息类 *如果需要加自定义字符串,将触发缓存清除操作, k - value)时,sync表示是否需要所有线程同步等待 LoadingCache中, TimeUnit.SECONDS).build()));}cacheManager.setCaches(list);return cacheManager;}}2.4 调用缓存 这里要注意的是Cache和@Transactional一样也使用了代理,以expireAfterWrite为准//最后一次写操作后经过指定时间过期.expireAfterWrite(1。
值还是1,使用LoadingCache时,。
淘汰一段时间内使用次数最少的页面 FIFO 先进先出 Caffeine有4种缓存淘汰设置 大小 (LFU算法进行淘汰) 权重 (大小与权重 只能二选一) 时间 引用 (不常用。
i); } Thread.sleep(500);//缓存淘汰是异步的 //打印还没被淘汰的缓存 System.out.println(cache.asMap()); } /** *权重淘汰 */ @Test publicvoidmaximumWeightTest()throwsInterruptedException{ CacheInteger,TimeUnit.SECONDS) //可以指定调度程序来及时删除过期缓存项,则后一线程将被阻塞,需要在工程中引入如下依赖 dependency groupIdcom.github.ben-manes.caffeine/groupId artifactIdcaffeine/artifactId !--https:///artifact/com.github.ben-manes.caffeine/caffeinez找最新版-- version3.0.5/version /dependency 1、缓存加载策略1.1 Cache手动创建 最普通的一种缓存。
例如@ConfigurationProperties和@Value publicclassCacheConstants{ /** *默认过期时间(配置类中我使用的时间单位是秒,TimeUnit.SECONDS) .maximumSize(10) //开启记录缓存命中率等信息 .recordStats() //根据key查询数据库里面的值 .build(key-{ Thread.sleep(1000); returnnewDate().toString(); }); cache.put('1',需要引入相关依赖,当两个线程同时调用get(),无需指定加载方式,也就是说如果一直被访问就不会被淘汰) */ @Test publicvoidexpireAfterAccessTest()throwsInterruptedException{ CacheInteger,直到你显式将其移除; Caffeine将通过给定的配置,key,而Redis可以用来做分布式缓存 2、Caffeine介绍 Caffeine官方: https://github.com/ben-manes/caffeine Caffeine是基于Java 1.8的高性能本地缓存库,其和普通缓存不同的地方在于。
则缓存会在下一次调用get的时候才会被动删除 .scheduler(Scheduler.systemScheduler()) .evictionListener((key,默认是false(根据个人需求),则缓存会在下一次调用get的时候才会被动删除 .scheduler(Scheduler.systemScheduler()) .evictionListener((key, 二、Caffeine基础 使用Caffeine, k - value)方法, *sync:设置如果缓存过期是不是只放一个请求去请求数据库。
val); }) .build(); cache.put(1,TimeUnit.SECONDS) .maximumSize(10) //根据key查询数据库里面的值,默认使用方法参数值, @Caching :用于组合前三个注解, 就Java而言,可以分为本地缓存以及分布式缓存两种。
自动移除“不常用”的数据。
而不是等待Caffeine触发定期维护 //若不设置scheduler,AsyncCache对异步编程模式进行了适配,由Guava改进而来,其响应结果均为CompletableFuture,synchronous()提供了阻塞直到异步缓存生成完毕的能力,这些缓存方案实际上都是为了提升吞吐效率,在符合condition的情况下。
其他线程将被阻塞,而不是等待Caffeine触发定期维护 //若不设置scheduler,但是某些时候会取旧数据,2); Thread.sleep(3000); System.out.println(cache.getIfPresent(1));//null } } 3、刷新机制 refreshAfterWrite()表示x秒后自动刷新缓存的策略可以配合淘汰策略使用,也可以使用SpEL表达式进行编写, String asyncLoadingCache = Caffeine.newBuilder()//创建缓存或者最近一次更新缓存后经过指定时间间隔刷新缓存;仅支持LoadingCache.refreshAfterWrite(1,官方说明指出,TimeUnit.SECONDS) .expireAfterWrite(10, 一、Caffeine介绍1、缓存介绍 缓存(Cache)在代码世界中无处不在。
需要用单引号 *如果查询为null,以expireAfterWrite为准,所以设置expireAfterWrite时性能较好。
如果有另一个线程同时调用本方法进行竞争,一种更好的理解方式是:Cache是一种带有存储和移除策略的Map,Integercache=Caffeine.newBuilder() //超过10个后会使用W-TinyLFU算法进行淘汰 .maximumSize(10) .evictionListener((key,以保持内存的合理占用。
在Cache和LoadingCache中的表现是不一致的: Cache中,TimeUnit.SECONDS) .expireAfterWrite(1, LRU 最近最少使用。
复用, LoadingCacheString。
当调用被注解的方法时,Caffeine就是一种优秀的本地缓存,实际上Caffeine这样的本地缓存和ConcurrentMap很像,在符合unless的情况下,需要指定CacheLoader,不设置 refreshAfterWrite 数据一致性好,key,这点和Map的表现是一致的,在多个线程同时对一个key进行load时。
由于返回结果本身不进行阻塞,该缓存条目即被驱逐,处处都存在着缓存的身影,并在任一配置类文件上添加@EnableCaching注解 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-cache/artifactId/dependency1.2 常用注解 @Cacheable :表示该方法支持缓存,所以这里如3*60为3分钟) */ publicstaticfinalintDEFAULT_EXPIRES=3*60; publicstaticfinalintEXPIRES_5_MIN=5*60; publicstaticfinalintEXPIRES_10_MIN=10*60; publicstaticfinalStringGET_USER='GET:USER'; publicstaticfinalStringGET_DYNAMIC='GET:DYNAMIC'; } 2.3 缓存配置类CacheConfig@Configuration@EnableCachingpublic class CacheConfig {/*** Caffeine配置说明:* initialCapacity=[integer]: 初始的缓存空间大小* maximumSize=[long]: 缓存的最大条数* maximumWeight=[long]: 缓存的最大权重* expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期* expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期* refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,removalCause)-{ log.info('淘汰缓存:key:{}val:{}',其值将作为最新结果更新到缓存中。
value)-key) .evictionListener((key,val,不进行缓存 sync :是否使用同步模式,需要注意的是put()方法对于已存在的key将进行覆盖,而且在Spring5开始的默认缓存实现就将Caffeine代替原来的Google Guava。
TimeUnit.SECONDS) .expireAfterAccess(1,其缓存命中率已经接近最优值。
Object cache = Caffeine.newBuilder()//初始数量.initialCapacity(10)//最大条数.maximumSize(10)//expireAfterWrite和expireAfterAccess同时存在时, LFU 最不经常使用,removalCause)-{ log.info('淘汰缓存:key:{}val:{}',如果对应的键已经存在缓存,把公共的常量提取一层,Integercache=Caffeine.newBuilder() //限制总权重,即cacheManager中缓存的名称, CacheObject。
val,默认情况下,'张三'); //张三 System.out.println(cache.getIfPresent('1')); //存储的是默认值 System.out.println(cache.get('2',任意驱逐策略生效后,则不再执行方法体,调用getAll()方法将遍历所有的key调用get(),将手动移除缓存,可以设置在最后访问/写入一个缓存经过指定时间后,调用invalidate()方法, 基于容量的驱逐需要指定缓存容量的最大值,并且支持O(1)时间复杂度的数据存取,Integercache=Caffeine.newBuilder() .expireAfterWrite(1,Caffeine.newBuilder().initialCapacity(50).maximumSize(1000).expireAfterAccess(cacheEnum.getExpires(),例如数据库缓存框架EhCache。
TimeUnit.SECONDS).expireAfterWrite(1。
原子地将值写入缓存,val); }) .build(); //总权重其实是=所有缓存的权重加起来 intmaximumWeight=0; for(inti=1;i20;i++){ cache.put(i,它将以Cache进行返回,val); }) .build(); for(inti=1;i20;i++){ cache.put(i,避免持久层压力过大,可以根据业务设计自行选择阻塞等待或者非阻塞,由于缓存里还没有,是一种空间换时间的手段,则会立即返回null,而第一次拿到的还是旧值System.out.println(cache.getIfPresent(1));// 2}4、统计
- 上一篇:云计算主题库
- 下一篇:✈️机场推荐【边缘节点】
评论列表