大厂面试真题-说说caffine缓存的原理和基本使用

Caffeine是一个基于Java的高性能缓存库,它提供了快速、高效的本地缓存解决方案。以下是关于Caffeine缓存的原理和基本使用的详细介绍:

一、Caffeine缓存的原理

  1. 数据存储:Caffeine使用内存作为数据存储介质,将缓存的数据存储在本地内存中。这样可以实现快速的数据读取和写入,避免了频繁的磁盘IO操作,提高了缓存的读写性能。
  2. 缓存淘汰策略:Caffeine采用了多种缓存淘汰策略,如基于访问时间、写入时间、大小等进行缓存项的淘汰。这些策略可以根据实际业务需求进行配置,保证缓存中的数据是最有用的数据,避免缓存过期或者存储过多无用数据。具体来说,Caffeine使用了W-TinyLFU算法,该算法结合了LRU和LFU的优点,并解决了它们的缺点。通过采用Count-Min Sketch算法降低频率信息带来的内存消耗,并维护一个PK机制保障新上的热点数据能够缓存。
  3. 并发访问控制:Caffeine使用了一些并发访问控制的技术,比如乐观锁、CAS(Compare and Swap)等,来保证在多线程并发访问时,对缓存数据的读取和更新操作是线程安全的,避免了数据不一致或者并发访问冲突的问题。
  4. 数据加载策略:Caffeine提供了数据加载的策略,当缓存中不存在需要的数据时,可以通过数据加载器进行数据的加载和初始化,以确保缓存中的数据是最新的和完整的。

二、Caffeine缓存的基本使用

  1. 引入依赖 :在使用Caffeine之前,需要在项目中引入Caffeine的依赖。例如,在Maven项目中,可以在pom.xml文件中添加Caffeine的依赖。

  2. 构建缓存 :使用Caffeine的newBuilder方法构建缓存对象,并配置相关的参数,如缓存的最大容量、写入后的过期时间等。例如:Cache<String, String> cache = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后的过期时间为10分钟 .maximumSize(10000) // 设置缓存的最大容量为10000 .build();

  3. 操作缓存

    • 添加或更新缓存元素 :使用put方法可以将一个键值对添加到缓存中,如果键已经存在,则更新其对应的值。
    • 获取缓存元素 :使用getIfPresent方法可以根据键获取缓存中的值,如果键不存在,则返回null。也可以使用get方法,如果键不存在,则通过提供的函数生成值并添加到缓存中。
    • 移除缓存元素 :使用invalidate方法可以根据键移除缓存中的元素。
  4. 使用LoadingCache :LoadingCache是附加在CacheLoader之上构建的缓存对象,它提供了更加便捷的数据加载方式。当调用getgetAll方法时,如果缓存中不存在对应的元素,则会通过CacheLoader加载数据并添加到缓存中。例如:LoadingCache<String, String> cache = Caffeine.newBuilder() .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .build(key -> create(key)); // 指定CacheLoader // 当调用get或getAll时,若找不到缓存元素,则会统一调用create(key)生成 String value = cache.get("key");

  5. 使用AsyncCache和AsyncLoadingCache:AsyncCache是Cache的异步实现方式,它提供了通过Executor生成缓存元素并返回CompletableFuture的能力。AsyncLoadingCache则是LoadingCache的异步形式。这些异步特性可以使得在缓存计算完成前,不会阻塞主线程的执行。

  6. 缓存统计和监听:Caffeine还提供了缓存统计和监听的功能,可以获取缓存的命中率、加载新值的平均时间等统计信息,并可以设置监听器来监听缓存的添加、更新和移除事件。

综上所述,Caffeine缓存库以其高性能、灵活性和可定制性在Java应用中得到了广泛的应用。通过合理的配置和使用,可以显著提高系统的性能和响应速度。

相关推荐
程序员张34 小时前
Maven编译和打包插件
java·spring boot·maven
Hello.Reader5 小时前
Redis 延迟监控深度指南
数据库·redis·缓存
ybq195133454315 小时前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339465 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8506 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT6 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟8 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
DuelCode9 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社29 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理9 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring