大厂面试真题-说说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应用中得到了广泛的应用。通过合理的配置和使用,可以显著提高系统的性能和响应速度。

相关推荐
夜斗小神社4 分钟前
【黑马点评】(二)缓存
缓存
艾迪的技术之路16 分钟前
redisson使用lock导致死锁问题
java·后端·面试
独立开阀者_FwtCoder23 分钟前
Vite Devtools 要发布了!期待
前端·面试·github
今天背单词了吗98034 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
天天摸鱼的java工程师36 分钟前
使用 Spring Boot 整合高德地图实现路线规划功能
java·后端
东阳马生架构1 小时前
订单初版—2.生单链路中的技术问题说明文档
java
咖啡啡不加糖1 小时前
暴力破解漏洞与命令执行漏洞
java·后端·web安全
风象南1 小时前
SpringBoot敏感配置项加密与解密实战
java·spring boot·后端
DKPT1 小时前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式