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

相关推荐
虾球xz6 分钟前
游戏引擎学习第61天
java·学习·游戏引擎
CodeClimb6 分钟前
【华为OD-E卷-租车骑绿道 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
梓沂8 分钟前
idea配置gitee仓库
java·gitee·intellij-idea
CodeClimb9 分钟前
【华为OD-E卷-MVP争夺战 100分(python、java、c++、js、c)】
java·python·华为od
大大怪将军~~~~18 分钟前
SpringBoot 入门
java·spring boot·后端
编码浪子20 分钟前
Springboot3国际化
java·spring·mybatis
HUNAG-DA-PAO28 分钟前
Spring AOP是什么
java·jvm·spring
带刺的坐椅31 分钟前
Solon v3.0.5 发布!(Spring 生态可以退休了吗?)
java·spring·solon
怒码ing34 分钟前
Java包装类型的缓存
java·开发语言·缓存
凡人的AI工具箱34 分钟前
每天40分玩转Django:Django缓存
数据库·人工智能·后端·python·缓存·django