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

相关推荐
奶糖趣多多12 分钟前
Redis知识点
数据库·redis·缓存
阿伟*rui12 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
CoderIsArt1 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot