广州做家教的网站,如何做网站小编,网站建设三方协议,网站备案是给什么进行备案原文首更地址#xff0c;阅读效果更佳#xff01;
Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html
传统缓存的问题
传统的缓存策略一般是请求到达 Tomcat 后#xff0c;先查询 Redis …原文首更地址阅读效果更佳
Redis进阶 - JVM进程缓存 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-jvm-process-cache.html
传统缓存的问题
传统的缓存策略一般是请求到达 Tomcat 后先查询 Redis 如果未命中则查询数据库存在下面的问题
请求要经过 Tomcat 处理Tomcat 的性能成为整个系统的瓶颈Redis 缓存失效时会对数据库产生冲击 多级缓存方案
多级缓存就是充分利用请求处理的每个环节分别添加缓存减轻 Tomcat 压力提升服务性能 #本地进程缓存
缓存在日常开发中起着至关重要的作用由于是存储在内存汇总数据的读取速度是非常快的能大量减少对数据库的访问减少数据库的压力。我们把缓存分为两类 分布式缓存例如 Redis 优点存储容量更大、可靠性更好、可以再集群间共享缺点访问缓存有网络开销场景缓存数据量较大、可靠性要求较高、需要在集群间共享 进程本地缓存例如 HashMap、GuavaCache 优点读取本地内存没有网络开销速度更快缺点存储容量有限、可靠性能较低、无法共享场景性能要求较高缓存数据量较小
Caffeine 是一个基于 Java8 开发的提供了近乎最佳命中率的高性能的本地缓存库。目前 Spring 内部的缓存使用的就是 Caffeine。
Github 地址https://github.com/ben-manes/caffeineopen in new window #Caffeine
Caffeine 是一个基于 Java8 开发的提供了近乎最佳命中率的高性能的缓存库。
缓存和 ConcurrentMap 有点相似但还是有所区别。最根本的区别是 ConcurrentMap 将会持有所有加入到缓存当中的元素直到它们被从缓存当中手动移除。但是Caffeine 的缓存 Cache 通常会被配置成自动驱逐缓存中元素以限制其内存占用。在某些场景下LoadingCache 和AsyncLoadingCache 因为其自动加载缓存的能力将会变得非常实用。
Caffeine 提供了灵活的构造器去创建一个拥有下列特性的缓存
自动加载元素到缓存当中异步加载的方式也可供选择当达到最大容量的时候可以使用基于就近度和频率的算法进行基于容量的驱逐将根据缓存中的元素上一次访问或者被修改的时间进行基于过期时间的驱逐当向缓存中一个已经过时的元素进行访问的时候将会进行异步刷新key 将自动被弱引用所封装value 将自动被弱引用或者软引用所封装驱逐(或移除)缓存中的元素时将会进行通知写入传播到一个外部数据源当中持续计算缓存的访问统计指标
为了提高集成度扩展模块提供了 JSR-107 JCache 和 Guava 适配器。 JSR-107 规范了基于 Java 6 的 API在牺牲了功能和性能的代价下使代码更加规范。
Guava 的 Cache 是 Caffeine 的原型库并且 Caffeine 提供了适配器以供简单的迁移策略。
原文地址
https://github.com/ben-manes/caffeine/wiki/Home-zh-CNopen in new window
#Caffeine示例 Test
void testCaffeine(){// 1.创建缓存对象CacheString,String cache Caffeine.newBuilder().build();// 2.存数据cache.put(username,codermast);// 3.1取数据不存在则返回 NullString username cache.getIfPresent(username);System.out.println(username username);// 3.2取数据不存在则从数据库查询String username2 cache.get(username,key - {// 这里写的是去数据库查询的业务逻辑// ...return Hello World!;});System.out.println(username2 username2);
}#Caffeine缓存驱逐策略
Caffeine 提供了三种缓存驱逐策略
基于容量设置缓存的数量上限使用 LRU 规则选择 // 创建缓存对象
CacheString,String cache Caffeine.newBuilder().maximumSize(1) // 设置缓存大小上限为 1.build();基于时间设置缓存的有效时间 // 创建缓存对象
CacheString,String cache Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(10)) // 设置缓存有效期为 10 s从最后一次写入操作开始计时.build();基于引用设置缓存为软引用或者弱引用利用 GC 来回收缓存数据。性能较差不建议使用。
在默认情况下当一个缓存元素过期的时候Caffeine 不会自动立即将其清理和驱逐。而是在一次读或者写操作后或者在空闲时间完成对失效数据的驱逐。
注释
JVM 进程缓存和 Redis 缓存本质上都是对数据的缓存目的都是为了加速数据的读取。