当前位置: 首页 > news >正文

朔州seo网站建设永信南昌网站建设

朔州seo网站建设,永信南昌网站建设,手机端网站搭建,wordpress如何关注博客1. 简介 在编程领域#xff0c;缓存是不可或缺的一部分#xff0c;从处理器到应用层#xff0c;其应用无处不在。从根本上讲#xff0c;缓存是利用空间换取时间的一种策略#xff0c;通过优化数据存储方式#xff0c;提高后续数据访问速度。 对于Java开发者来说#x…1. 简介 在编程领域缓存是不可或缺的一部分从处理器到应用层其应用无处不在。从根本上讲缓存是利用空间换取时间的一种策略通过优化数据存储方式提高后续数据访问速度。 对于Java开发者来说有很多常用的缓存解决方案例如EhCache和Memcached等。这些解决方案的核心目标是提高系统吞吐量减轻数据库等持久层的压力。 根据其部署和应用范围缓存可以分为本地缓存和分布式缓存两种类型。Caffeine是一种非常优秀的本地缓存解决方案而Redis则广泛用于分布式缓存场景。 Caffeine是一个基于Java 1.8的高性能本地缓存库源自Guava的改进。自Spring 5开始Caffeine已成为默认的缓存实现取代了原先的Google Guava。官方资料显示Caffeine的缓存命中率已接近理论最优值。实际上Caffeine与ConcurrentMap在功能上有许多相似之处都支持并发操作且数据的存取时间复杂度为O(1)。然而二者在数据管理策略上存在显著差异 ConcurrentMap会保留存入的所有数据除非用户显式地移除而Caffeine则根据预设的配置自动剔除“不常用”的数据确保内存的合理使用。 因此更恰当的理解是Cache是一种具备存储和移除策略的Map。 2. 核心特性 高性能Caffeine采用了多种优化技术包括基于链表和哈希表的数据结构、优化的内存访问模式以及针对并发访问的优化算法以减少缓存的内存占用和提高缓存访问速度。这使得它在读写操作上有着卓越的表现。内存管理Caffeine实现了自适应的内存管理能够根据缓存的使用情况动态调整内存分配。它还支持不同的缓存过期策略有效控制内存使用。过期策略Caffeine支持多种缓存过期策略如基于时间、基于大小、基于引用等同时也允许用户自定义过期策略。简洁而强大的APICaffeine提供了简洁而强大的API使得缓存的创建和使用变得相对简单。缓存加载器Caffeine提供了CacheLoader接口使得异步加载和刷新缓存项变得更容易。监听器和事件可以使用监听器跟踪缓存的变化对缓存进行事件监听和处理。 3. Caffeine使用 3.1 手动创建 import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import java.util.concurrent.TimeUnit; public class CaffeineManualExample { // 创建一个指定最大容量的缓存缓存项在写入后10分钟过期 private static final CacheString, String CACHE Caffeine.newBuilder() .maximumSize(100) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); public static void main(String[] args) { // 向缓存中添加数据 CACHE.put(key1, value1); CACHE.put(key2, value2); // 从缓存中获取数据 String value1 CACHE.getIfPresent(key1); System.out.println(Value for key1: value1); // 等待一段时间后缓存项过期再次尝试获取将返回null try { Thread.sleep(TimeUnit.MINUTES.toMillis(15)); } catch (InterruptedException e) { e.printStackTrace(); } String value2 CACHE.getIfPresent(key2); System.out.println(Value for key2 (after expiration): value2); // 输出null } }3.2 自动创建 在Spring Boot应用中你可以使用Cacheable和CacheEvict注解来自动创建缓存。首先确保你的Spring Boot项目已经添加了Spring Boot Cache Starter的依赖。 常用注解 Cacheable 表示该方法支持缓存。当调用被注解的方法时如果对应的键已经存在缓存则不再执行方法体而从缓存中直接返回。当方法返回null时将不进行缓存操作。CachePut 表示执行该方法后其值将作为最新结果更新到缓存中每次都会执行该方法。CacheEvict 表示执行该方法后将触发缓存清除操作。Caching 用于组合前三个注解。 常用注解属性 cacheNames/value 缓存组件的名字即cacheManager中缓存的名称。key 缓存数据时使用的key。默认使用方法参数值也可以使用SpEL表达式进行编写。keyGenerator 和key二选一使用。cacheManager 指定使用的缓存管理器。condition 在方法执行开始前检查在符合condition的情况下进行缓存。unless 在方法执行完成后检查在符合unless的情况下不进行缓存。sync 是否使用同步模式。若使用同步模式在多个线程同时对一个key进行load时其他线程将被阻塞。 下面是一个简单的例子 添加依赖在pom.xml中添加Spring Boot Cache Starter的依赖 dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-cache/artifactId /dependency配置缓存在application.properties或application.yml中配置Caffeine作为缓存提供者 spring.cache.typecaffeine spring.cache.caffeine.specmaximumSize500,expireAfterWrite60m # 指定缓存最大容量为500缓存项在写入后60分钟过期。使用注解创建一个服务类并使用Cacheable和CacheEvict注解来标记方法 import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; Service public class ExampleService { Cacheable(value exampleCache) // 将方法结果缓存到名为exampleCache的缓存中。 public String getData() { // 模拟耗时操作如数据库查询。这里只是返回一个字符串。 return data; }CacheEvict(value exampleCache, key #id) // 从名为exampleCache的缓存中移除指定键#id的缓存项。 public void evictData(String id) { // 该方法目前没有实际功能只是为了演示如何使用CacheEvict。 } }3.3 Caffeine的异步获取 Caffeine的异步获取功能允许你在缓存数据加载时执行异步操作从而减少应用程序的等待时间。你可以使用CacheLoader接口来定义异步加载缓存项的逻辑。当缓存中没有对应的数据时Caffeine会自动触发CacheLoader的实现类来异步加载数据。一旦数据加载完成它将被存入缓存并返回给调用者。使用异步获取功能可以解决应用程序在等待数据加载时阻塞的问题提高整体性能。 使用示例 定义一个实现CacheLoader接口的类实现load方法 import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.LoadingCache; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class AsyncDataLoader implements CacheLoaderString, String { Override public CompletableFutureString load(String key) throws Exception { // 模拟耗时操作如数据库查询。这里只是返回一个字符串。 String data Async data for key: key; return CompletableFuture.completedFuture(data); // 返回异步加载的结果。 } }创建一个基于AsyncDataLoader的LoadingCache实例 import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; import java.util.concurrent.TimeUnit; public class CaffeineAsyncExample { public static void main(String[] args) { // 创建异步加载缓存的实例指定缓存的容量和过期时间等配置。 LoadingCacheString, String cache Caffeine.newBuilder() .maximumSize(100) // 缓存最大容量为100个键值对。 .expireAfterWrite(10, TimeUnit.MINUTES) // 缓存项在写入后10分钟过期。 .build(new AsyncDataLoader()); // 使用自定义的AsyncDataLoader作为加载器。 // 从缓存中获取数据如果缓存中没有数据则会触发异步加载。 String data cache.get(key1); // 返回的数据可能是null因为此时数据可能正在异步加载中。 System.out.println(Data for key1: data); // 输出可能为null因为数据可能还没有加载完成。 } }在上面的示例中我们定义了一个AsyncDataLoader类来实现CacheLoader接口。该类中的load方法用于异步加载数据。然后我们使用Caffeine的LoadingCache构建器创建了一个基于AsyncDataLoader的缓存实例。当从缓存中获取数据时如果缓存中没有对应的数据Caffeine会自动调用AsyncDataLoader的load方法进行异步加载。请注意获取到的数据可能为null因为此时数据可能正在异步加载中。你可以根据实际需求对异步加载的数据进行处理。 3.4 驱逐策略 Caffeine 的驱逐策略决定了当缓存满了之后哪些缓存项会被移除。了解驱逐策略对于正确使用缓存和优化缓存性能非常重要。 Caffeine 支持多种驱逐策略以下是其中一些 最近最少使用LRU这是最常见的驱逐策略它将最长时间未被使用的缓存项驱逐出缓存。当缓存满了并且需要添加新的缓存项时它会移除最长时间未被使用的缓存项。先进先出FIFO这种策略按照缓存项的插入顺序进行驱逐。当缓存满了并且需要添加新的缓存项时它会移除最早插入的缓存项。基于大小的驱逐这种策略根据缓存项的大小进行驱逐。当缓存满了并且需要添加新的缓存项时它会移除最小的缓存项。这对于需要存储大量数据的场景非常有用例如图片缓存。基于时间的驱逐这种策略根据缓存项的过期时间进行驱逐。当缓存满了并且需要添加新的缓存项时它会移除最早过期的缓存项。基于引用计数的驱逐这种策略使用引用计数来跟踪缓存项的引用次数。当缓存满了并且需要添加新的缓存项时它会移除引用计数最低的缓存项。这可以帮助避免热点数据占据整个缓存空间。基于权重的驱逐这种策略根据缓存项的权重进行驱逐。当缓存满了并且需要添加新的缓存项时它会移除权重最小的缓存项。这可以帮助在缓存中保留更有价值的数据。 在 Caffeine 中你可以通过 Cache 构造函数的第二个参数来指定驱逐策略。例如如果你想使用 LRU 驱逐策略你可以这样做 CacheKeyType, ValueType cache Caffeine.newBuilder() .maximumSize(100) // 设置最大容量为100 .evictionPolicy(Eviction.LRU) // 设置驱逐策略为LRU .build();3.5 刷新机制 在 Caffeine 中缓存数据在达到一定条件时会进行刷新以保持缓存的时效性。下面将对 Caffeine 的刷新机制进行详细讲解。 缓存项过期 Caffeine 支持设置缓存项的过期时间当缓存项过期后Caffeine 会自动将其从缓存中删除。默认情况下Caffeine 使用 JVM 的当前时间作为过期时间的起始点即从缓存项创建或最后一次修改时开始计时。当缓存项过期后Caffeine 会触发一次刷新操作重新加载缓存项的值。 懒加载 Caffeine 支持懒加载机制即只有在访问已过期的缓存项时才会触发刷新操作。这种机制可以减少不必要的缓存刷新操作提高缓存的效率。当访问已过期的缓存项时Caffeine 会异步地执行刷新操作同时返回缓存项的旧值。一旦刷新操作完成缓存项的值将被更新下次访问时将返回新值。 主动刷新 除了基于过期时间和懒加载的自动刷新外Caffeine 还支持主动刷新机制。通过调用 Caffeine 实例的 refresh 方法可以强制刷新指定的缓存项。这种机制适用于在某些情况下需要立即获取最新数据的情况。需要注意的是主动刷新可能会对缓存性能产生一定的影响因此应该谨慎使用。 并发控制 在高并发环境下多个线程可能同时访问已过期的缓存项导致多个线程同时执行刷新操作。为了避免这种情况Caffeine 提供了并发控制机制。通过设置 concurrencyLevel 参数可以指定每个缓存项允许的最大并发刷新操作数。当超过这个限制时后续的刷新请求将被阻塞或失败直到有空闲的刷新槽位。这种机制可以有效地防止过多的线程同时执行刷新操作提高缓存的性能和稳定性。 下面是一个使用 Caffeine 刷新机制的示例 首先定义一个实现了 Refreshable 接口的类该接口有一个 refresh 方法用于刷新缓存项 public class Data implements RefreshableData { private String value; private long timestamp; public Data(String value) { this.value value; this.timestamp System.currentTimeMillis(); } public String getValue() { return value; } public long getTimestamp() { return timestamp; } Override public Data refresh(long ttlMillis) { // 在这里实现刷新逻辑例如从数据库或其他数据源获取最新数据 // 并更新 timestamp 和 value。 // 如果 ttlMillis 大于 0表示设置一个时间限制超过该时间后缓存项将被驱逐。 return this; } }然后在 Caffeine 缓存配置中使用 refreshAfterWrite 方法指定刷新时间间隔 CacheString, Data cache Caffeine.newBuilder() .maximumSize(100) // 设置最大容量为100 .expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后10分钟过期 .refreshAfterWrite(5, TimeUnit.MINUTES) // 设置写入后5分钟刷新一次 .build(key - new Data(key)); // 自定义加载函数将键转换为 Data 对象最后在需要使用缓存的地方从缓存中获取数据并在必要时刷新缓存项 String key exampleKey; Data data cache.get(key); if (data ! null System.currentTimeMillis() - data.getTimestamp() 5 * 60 * 1000) { // 判断是否超过5分钟未刷新 data data.refresh(30 * 60 * 1000); // 调用 refresh 方法刷新缓存项设置30分钟TTL可选 cache.put(key, data); // 将刷新后的数据重新放入缓存中可选 }通过上述示例你可以使用 Caffeine 的刷新机制来自动更新缓存中的数据。需要注意的是刷新逻辑的具体实现取决于你的业务需求可能需要从数据库或其他数据源获取最新数据。 4. 总结 Java Caffeine 是一个高效的缓存库它通过灵活的配置和多种驱逐策略提供了强大的缓存功能。在 Java 应用程序中Caffeine 可以帮助我们提高数据访问速度减轻数据库负载并改善应用程序的性能。 总的来说Java Caffeine 是一个功能强大、易于使用的缓存库。通过合理地使用 Caffeine我们可以提高应用程序的性能和响应速度并降低对数据库的依赖。在处理大量数据和高并发请求时Caffeine 可以发挥出其优势成为 Java 开发者的有力助手。
http://www.pierceye.com/news/379893/

相关文章:

  • 网站关键词的写法牛肉煲的做法
  • 网站权限怎么设置吉林电商网站建设报价
  • wordpress修改站点名wordpress 插件 调用
  • vs2015做的网站广东省白云区属于哪个市
  • 微信群投票网站怎么做佳木斯做网站公司
  • 建设网站用哪个主机好阳西哪里有做网站
  • 沈阳市有做网站的公司中文企业网站html模板
  • 破解织梦做的网站有什么页游传奇平台好
  • 临安网站开发网站建设做什么费用
  • 辽宁建设工程信息网网站python 网站开发
  • 企业网站.net免费做ppt的网站
  • 浦城 做网站wordpress下载页面
  • 广西住房城乡建设部网站网站优化怎么看
  • 网站建设负责人证明网络营销的10个特点
  • 泉州市服务好的网站设计塘沽网吧开门了吗
  • 商城网站建设哪家公司好wordpress输出到模板
  • 建站报价网站建设培训学校
  • 杭州高端网站定制手机网站开发应注意
  • 深圳网站建设选云聚达做二手元器件那个网站查价格
  • 网站建设公司企业模板微网站开发制作
  • 北京网站制作计划合理的网站结构
  • 网站建设如何搭建框架兰州seo排名
  • 网站作为医院形象建设cms搭建网站
  • 如何做个购物网站网站开发好不好
  • wordpress国内打开速度慢东莞搜索seo关键词
  • 鹿泉建设网站广安市建设局官方网站
  • 用花生棒自己做网站如何看网站的浏览量
  • 大连网站排名电商线上培训
  • 做金融网站做简历的网站
  • 求网站建设合伙人wordpress子页面怎么修改密码