在 Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定...在内存不足时 对象缓存 内存不足时终止 弱引用 Weak Reference 在垃圾回收时 对象缓存 gc运行后终止 虚引用 Phantom Reference 从来不会 可以用虚引用来跟踪对象被垃圾回收器回收的活动...SpringBoot集成Caffeine Cache 在Caffeine Cache的介绍结束后,接下来介绍如何在项目中顺利集成Caffeine Cache。...maximumSize:设置缓存的最大条目数。当缓存达到这个大小时,它会开始进行清除。 maximumWeight:设置缓存的最大权重。...需要同时定义一个Weigher来如何计算缓存条目的权重。 weigher:定义了如何计算每个缓存条目的权重。
在 Spring5 (SpringBoot 2.x)后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine来说是一个很大的肯定...这样Cache.stats()方法将会返回当前缓存的一些统计指标,例如:hitRate:查询缓存的命中率。evictionCount:被驱逐的缓存数量。...集成Caffeine Cache在Caffeine Cache的介绍结束后,接下来介绍如何在项目中顺利集成Caffeine Cache。...maximumSize:设置缓存的最大条目数。当缓存达到这个大小时,它会开始进行清除。maximumWeight:设置缓存的最大权重。需要同时定义一个Weigher来如何计算缓存条目的权重。...weigher:定义了如何计算每个缓存条目的权重。expireAfterAccess:设置在特定时间段后访问缓存项后,会使其过期。
内存管理:Caffeine 提供了灵活的内存管理选项,可以通过设置缓存的最大大小、最大条目数或最大权重来控制缓存的大小。它还支持基于容量、时间或引用等策略来自动清理过期的缓存条目。...异步加载:Caffeine 支持异步加载缓存条目的功能。当缓存中不存在所需的条目时,它可以自动触发加载过程,并在加载完成后将结果放入缓存。...创建缓存实例:使用 Caffeine 的构建器模式创建一个缓存实例,可以设置缓存的参数和策略。 存储和获取数据:使用缓存的 put 方法将数据存储到缓存中,使用 get 方法从缓存中获取数据。...* * 基于容量的驱逐需要指定缓存容量的最大值,当缓存容量达到最大时,Caffeine将使用LRU策略对缓存进行淘汰;基于时间的驱逐策略如字面意思,可以设置在最后访问/写入一个缓存经过指定时间后...* * 驱逐策略可以组合使用,任意驱逐策略生效后,该缓存条目即被驱逐。 * * LRU 最近最少使用,淘汰最长时间没有被使用的页面。
(5, TimeUnit.SECONDS) // 设置超时时间为5s / 写入后隔段时间过期 .maximumSize(1)// 设置缓存最大条目数,超过条目则触发回收。...在Java 9+中,可以使用Cleaner来快速删除基于引用的条目(如果使用了弱引用key,弱引用value或软引用value)。...提供了三种定时驱逐策略 expireAfterWrite(long, TimeUnit) 在最后一次写入缓存后开始计时,在指定的时间后过期。...为了相应内存的需要,在GC过程中被软引用的对象将会被通过LRU算法回收。由于使用软引用可能会影响整体性能,我们还是建议通过使用基于缓存容量的驱逐策略代替软引用的使用。...我们在时间T访问并获取到值v1,在T+5秒的时候,数据库中这个值已经更新为v2。但是在T+12秒,即已经过了10秒我们通过Caffeine从本地缓存中获取到的「还是v1」,并不是v2。
最根本的区别是ConcurrentMap将会持有所有加入到缓存当中的元素,直到它们被从缓存当中手动移除。但是,Caffeine的缓存Cache 通常会被配置成自动驱逐缓存中元素,以限制其内存占用。...Caffeine提供了灵活的构造器去创建一个拥有下列特性的缓存: 自动加载元素到缓存当中,异步加载的方式也可供选择 当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐 将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐...引入依赖 在项目中使用 Caffeine 非常简单,只需在构建工具中添加相应的依赖即可。...例子 下面展示一个简单的示例,演示如何使用 Caffeine 创建和使用缓存。...使用 get 方法并提供加载函数,当缓存中不存在对应数据时会调用加载函数获取并存入缓存。 统计信息: 通过 userCache.stats() 获取缓存的统计数据,包括命中次数、未命中次数等。
并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。...Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。...Caffeine提供灵活的结构来创建缓存,并且有以下特性:自动加载条目到缓存中,可选异步方式可以基于大小剔除可以设置过期时间,时间可以从上次访问或上次写入开始计算异步刷新keys自动包装在弱引用中values...自动包装在弱引用或软引用中条目剔除通知缓存访问统计 简单使用导入pom依赖 com.github.ben-manes.caffeine...如果没有强引用这个value,则GC时允许回收该条目 Caffeine.softValues() 使用软引用存储value, 如果没有强引用这个value,则GC内存不足时允许回收该条目 引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态
内存友好:Caffeine支持自动驱逐缓存中的元素,以限制其内存占用。它还提供了灵活的构造器,可以创建具有不同特性的缓存,如自动加载元素、基于容量的驱逐、基于过期时间的驱逐等。...当缓存中的数据量超过了设定的最大值,Caffeine 会自动回收最近最少使用的数据。定时回收:Caffeine 支持定时回收策略,可以设置缓存中的数据在一定时间后被强制回收。...在创建 Caffeine 缓存时,使用 recordStats 方法启用统计信息收集功能。启用统计信息收集功能后,使用 stats 方法获取缓存的统计信息。...在缓存中添加了两个缓存项后,我们等待了一段时间,让缓存项过期。然后,我们使用 stats 方法获取了缓存的统计信息,并将其打印出来。...在开发和测试环境中,启用统计信息收集功能可以帮助你更好地了解缓存的使用情况,从而优化缓存的配置和使用。我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
时间局部性指的是近期访问的数据可能在不久的将来再次被访问 空间局部性指的是与当前访问的数据相邻的数据可能很快被访问。 本地缓存是指将数据暂存到本地计算机的内存中,以便在后续访问中能够更快地获取。...本地缓存通常由应用程序使用,可以提高应用程序的性能和响应速度。 Map 在Java中,实现本地缓存通常使用key/value形式的数据结构,可以选择使用Map集合来作为存储容器。...并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。...Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。...用途 生存时间 强引用 从来不会 对象的一般状态 JVM停止运行时终止 软引用 在内存不足时 对象缓存 内存不足时终止 弱引用 在垃圾回收时 对象缓存 gc运行后终止 虚引用 Unknown Unknown
本地缓存是直接从本地内存中读取数据,没有网络开销,性能更高,例如秒杀系统或者数据量小的缓存等,比远程缓存更合适。 Caffeine 介绍 Caffeine 是基于 JAVA 8 的高性能缓存库。...在 Spring5 (spring boot 2.x) 后,Spring 官方放弃了 Guava Cache 作为缓存机制,而是使用性能更优秀的 Caffeine 作为默认缓存组件,这对于Caffeine...关于Caffine Cache 的各种参数设置,以及常用的API在各种场景下如何使用演示测试 @RunWith(SpringRunner.class) @SpringBootTest(classes =...2、基于时间(Time-based) Caffeine提供了三种定时驱逐策略: expireAfterAccess(long, TimeUnit):在最后一次访问或者写入后开始计时,在指定的时间后过期。...Caffeine.softValues() 使用软引用存储value。当内存满后,软引用的对象使用最近最少使用(least-recently-used ) 的方式进行垃圾回收。
Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略。...在实际业务中这里可以把我们代码中的mapper传入进去,进行数据源的刷新。 但是实际使用中,你设置了一天刷新,但是一天后你发现缓存并没有刷新。...这是因为必有在1天后这个缓存再次访问才能刷新,如果没人访问,那么永远也不会刷新。你明白了吗? 我们来看看自动刷新他是怎么做的呢?...例如,如果计算某个组中的任何键的值将为该组中的所有键提供值,则loadAll可能会同时加载该组的其余部分。...我们也可以使用权重的策略来进行驱逐,可以使用Caffeine.weigher(Weigher) 函数来指定权重,使用Caffeine.maximumWeight(long) 函数来指定缓存最大权重值。
《Caffeine入门使用》 -> 《Caffeine基础源码解析》 -> 《Caffeine 驱逐算法》 一、概况 就一般的互联网行业中的应用而言,目前比较通用的并且也是普遍存在的一个应用工作过程...业界内很常见的一个普遍方案就是引进缓存,将计算结果、磁盘文件结果信息缓存于内存之中,那么上图中每个环节都可以从缓存中直接获取所需信息,减少应用服务器的压力,也就是通过减少磁盘读取、数据计算等方式来快速获取所需结果...当我们提到缓存的时候,第一时间就会想到Redis、memcached缓存中间件,他们支持分布式的缓存,还有一种是基于单机内存的缓存方式,例如最简单的java中的局部变量、java中的ConcurrentHashMap...、谷歌发布的Guava cache组件以及本文讲解的Caffeine cache,他们将缓存信息存储于应用本身的内存之中,业务可以缓存组件的API去操作内存中的缓存数据。...基于大小过期:当缓存超出后,使用W-TinyLFU算法进行缓存淘汰处理 基于缓存条目过期 maximumSize()方法,参数是缓存中存储的最大缓存条目,当添加缓存时达到条目阈值后,将进行缓存淘汰操作
我们在时间T访问并获取到值v1,在T+5秒的时候,数据库中这个值已经更新为v2。但是在T+12秒,即已经过了10秒我们通过Caffeine从本地缓存中获取到的「还是v1」,并不是v2。...在这个获取过程中,Caffeine发现时间已经过了10秒,然后会将v2加载到本地缓存中,下一次获取时才能拿到v2。...内存占用对比 Caffeine可以根据使用情况延迟初始化,或者动态调整它内部数据结构。这样能减少对内存的占用。如下图所示,使用了gradle memoryOverhead对内存占用进行了压测。...由于简洁的实现、高效的运行时表现以及在常规的使用场景下有不错的命中率,LRU(Least Recently Used)策略或许是最流行的驱逐策略,,它在保持算法简单的前提下,效果还不错。...想看更多的场景测试,请查看相应的论文,也可以在使用simulator来测试自己的场景: ?
比如有部新剧出来了,我们使用 LFU 给他缓存下来,这部新剧在这几天大概访问了几亿次,这个访问频率也在我们的 LFU 中记录了几亿次。...提供了三种定时驱逐策略: expireAfterAccess(long, TimeUnit):在最后一次访问或者写入后开始计时,在指定的时间后过期。...在内存不足时 对象缓存 内存不足时终止 弱引用 Weak Reference 在垃圾回收时 对象缓存 gc运行后终止 虚引用 Phantom Reference 从来不会 可以用虚引用来跟踪对象被垃圾回收器回收的活动...下面我们来说在SpringBoot2.x版本中如何使用cache。 1....,也可以直接使用SimpleCacheManager获取缓存的key进而进行操作。
堆外缓存把数据放在JVM堆外的,缓存数据对GC影响较小,同时它是在机器内存中的,相对与Redis也没有网络开销,最终选择OHC。...4.OHC缓存状态监控 OHC缓存的命中次数、内存使用状态等存储在OHCacheStats中,可以通过OHCache.stats()获取。...OHCacheStates信息: hitCount:缓存命中次数,表示从缓存中成功获取数据的次数。 missCount:缓存未命中次数,表示尝试从缓存中获取数据但未找到的次数。...evictionCount:缓存驱逐次数,表示因为缓存空间不足而从缓存中移除的数据项数量。 expireCount:缓存过期次数,表示因为缓存数据过期而从缓存中移除的数据项数量。...3.在存储每个键值对时,会调用CacheSerializer#serializedSize计算序列化后的内存空间占用,从而申请堆外内存。
缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。今天我们主要聊一聊多级缓存那些事。传统缓存的问题在传统的缓存策略。...本地缓存:JVM 层面,应用系统在运行期间,应用系统独立在内存中产生的缓存,例如 Caffeine、Google Guava 等。浏览器缓存目前大部分的浏览器本身也会有缓存。...因为在jvm进程中进行本地缓存,例如HashMap、GuavaCache。它们读取的是本地的内存,没有丝毫的网络开销,速度非常快。...批量获取缓存 批量获取缓存estimatedSize()estimatedSize() caffeineCache.estimatedSize()获取缓存中的个数Caffeine提供了三种缓存驱逐策略基于容量...涉及到GC性能较差,不建议使用。在默认情况下,当一个缓存元素过期的时候,caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。
高性能本地缓存 在将本地缓存前你肯定在想,本地缓存有么好讲的,不就是一个map么。把要缓存的数据存入map中,自己就能实现。...expireAfterWriter():表示从最后一次写入后多久会过期。 weakKeys():key使用了弱引用。 weakValues():value值使用了弱引用,防止内存泄漏。...” Caffeine使用了线程安全,并发下性能优良的ConcurrentMap 我们开始从缓存中获取: String valueFromCache = cache.get("lvshen", key...一般来说查缓存有3步: 从缓存中查询,如果缓存中有值,返回 如果缓存中没有值,则从数据库中获取,并返回 将数据库中的值存入缓存中 Caffeine本地缓存也是这个逻辑,为了模拟这个逻辑,我们两次从缓存中获取...,在性能上更加强大(高命中率、低内存占用),具体实现这里就不做详述。
--- 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。...--- 上一篇文章中,我们聊了下Caffeine的同步、异步的数据回源方式。本篇文章我们再一起研讨下Caffeine的多种不同的数据淘汰驱逐机制,以及对应的实际使用。...key1写入后,当前缓存内的keys:[key1] key1被移除,原因:SIZE key2写入后,当前缓存内的keys:[key2] 同样地,我们看下使用Caffeine实现一个限制容量大小的缓存对象的处理表现...比较适用于热点数据的存储场景,可以保证较高的缓存命中率。同样地,数据过期时也不会被立即从内存中移除,而是基于惰性删除机制进行处理。...图片 weakValues 与weakKeys类似,我们可以在创建缓存对象的时候使用weakValues指定将value值以弱引用的方式存储到缓存中。
比如有部新剧出来了,我们使用 LFU 给他缓存下来,这部新剧在这几天大概访问了几亿次,这个访问频率也在我们的 LFU 中记录了几亿次。...提供了三种定时驱逐策略: expireAfterAccess(long, TimeUnit):在最后一次访问或者写入后开始计时,在指定的时间后过期。...在内存不足时 对象缓存 内存不足时终止 弱引用WeakReference 在垃圾回收时 对象缓存 gc运行后终止 虚引用PhantomReference 从来不会 可以用虚引用来跟踪对象被垃圾回收器回收的活动...下面我们来说在SpringBoot2.x版本中如何使用cache。 1....,也可以直接使用SimpleCacheManager获取缓存的key进而进行操作。
比如有部新剧出来了,我们使用 LFU 给他缓存下来,这部新剧在这几天大概访问了几亿次,这个访问频率也在我们的 LFU 中记录了几亿次。...提供了三种定时驱逐策略: expireAfterAccess(long, TimeUnit):在最后一次访问或者写入后开始计时,在指定的时间后过期。...由于使用软引用是需要等到内存满了才进行回收,所以我们通常建议给缓存配置一个使用内存的最大值。softValues() 将使用身份相等(identity) (==) 而不是equals() 来比较值。...下面我们来说在SpringBoot2.x版本中如何使用cache。...,也可以直接使用SimpleCacheManager获取缓存的key进而进行操作。
领取专属 10元无门槛券
手把手带您无忧上云