【Caffeine入门】浅谈缓存框架Caffeine

缓存框架 Caffeine 的可视化探索与实践 Caffeine 作为一个高性能的缓存框架而被大量使用。本文基于Caffeine已有的基础进行定制化开发实现可视化功能。 阅读详情

Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美。Caffeine受启发于Guava Cache的API,使用API和Guava是一致的。它借鉴了Guava Cache和ConcurrentLinkedHashMap的设计经验。

在Springboot中使用Caffeine

在工程的pom文件引入caffeine的依赖,如下:

<dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.6.2</version>
        </dependency>

创建一个抽象类AbstractCaffineCache,该类使用范型来约束缓存的数据类型,并实现了三个方法,put、get、clear。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:44
 */
public abstract class AbstractCaffeineCache<T> {

    protected LoadingCache<String, T> loadingCache;

    abstract LoadingCache<String, T> createLoadingCache();

    public boolean put(String key, T value) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        loadingCache.put(key, value);

        return Boolean.TRUE;
    }

    public T get(String key) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        try {

            return loadingCache.get(key);
        } catch (Exception e) {
            return null;
        }
    }

    public boolean clear(String key) {
        if (loadingCache == null) {
            loadingCache = createLoadingCache();
        }
        loadingCache.invalidate(key);
        return Boolean.TRUE;
    }

}

创建MyCaffeineCache的缓存类,该类缓存类。创建LoadingCache类,该类设置了缓存过期的时间,最大的缓存个数。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:44
 */

public class MyCaffeineCache extends AbstractCaffeineCache {

    /**
     * Caffeine配置说明:
     * initialCapacity=[integer]: 初始的缓存空间大小
     * maximumSize=[long]: 缓存的最大条数
     * maximumWeight=[long]: 缓存的最大权重
     * expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
     * expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
     * refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
     * recordStats:开发统计功能
     *
     * @return
     */
    @Override
    LoadingCache createLoadingCache() {
        loadingCache = Caffeine.newBuilder()
                .expireAfterWrite(1000L, TimeUnit.MILLISECONDS)
                .initialCapacity(10)
                .maximumSize(100)
                .recordStats()
                .build((CacheLoader<String, String>) key -> null);
        return loadingCache;
    }
}

将MyCaffeineCache注入到spring ioc中,代码如下:

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/3/7 10:45
 */
@Configuration
public class CaffeineCacheConfig {
    @Bean
    public MyCaffeineCache MyCaffeineCache(){
        return new MyCaffeineCache();
    }
}

如何使用。

/**
 * @Author ZhuZiKai
 * @Description
 * @date 2022/1/6 9:45
 */
@Aspect
@Component
@Slf4j
public class IdempotentAspect extends BaseController {

    @Resource
    private MyCaffeineCache cache;

    private static final ThreadLocalUtil threadLocalUtil = new ThreadLocalUtil();

    @Around(value = "@annotation(idempotent)")
    public Object around(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable {

        UserBO user = getUserBO(request);
        Integer userId = user.getUserId();

        String userRequest = userId + request.getRequestURI();

        threadLocalUtil.setLocalUserRequest(userRequest);

        Object uuid = cache.get(userRequest);
        VerifyUtils.throwWhen(uuid != null, idempotent.value());

        return joinPoint.proceed();

    }

    @AfterReturning(value = "@annotation(idempotent)")
    public void afterReturning(JoinPoint point, Idempotent idempotent) {
        try {
            cache.put(threadLocalUtil.getLocalUserRequest(), UUIDUtil.simpleUUID());
        } finally {
            threadLocalUtil.clearLocalUserRequest();
        }
    }
}

使用本地缓存可以加快页面响应速度,缓存分布式缓存读压力,大量、高并发请求的网站比较适用

Caffeine配置说明:

  • initialCapacity=[integer]: 初始的缓存空间大小
  • maximumSize=[long]: 缓存的最大条数
  • maximumWeight=[long]: 缓存的最大权重
  • expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
  • expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
  • refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
  • recordStats:开发统计功能

注意:
expireAfterWrite和expireAfterAccess同时存在时,以expireAfterWrite为准。

本地高性能缓存Caffeine 阅读详情

相关推荐

Caffeine缓存方法与接口详解

Caffeine是一个高性能的Java缓存库,提供了丰富的API接口和方法来支持缓存的各种操作。以下是对Caffeine中主要接口和方法的详细解析,包括它们的作用和示例代码。Caffeine提供了丰富的API接口和方法来支持缓存的各种操作,包括同步和异步的缓存访问、自动加载、移除监听以及统计信息收集等。通过合理使用这些接口和方法,可以构建出高性能、可扩展的缓存系统。

weixin_52749896的博客 1936

Caffeine缓存

在本文中,我们来看看 Caffeine — 一个高性能的 Java 缓存库。 缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item。 回收策略为在指定时间删除哪些对象。此策略直接影响缓存的命中率 — 缓存库的一个重要特征。 Caffeine 因使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率。 填充策略(Population) Caffeine 为我们提供了三种填充策略:手动、同步和异步 手动加载(Manual) Cache<String, Object>

qq_35448165的博客 8964

多级缓存入门:Caffeine、Lua、OpenResty、Canal

多级缓存 JVM进程缓存 Caffeine Lua语法入门 Nginx业务编码实现多级缓存 OpenResty Redis缓存预热 OpenResty查询Redis缓存 Nginx本地(OpenResty)缓存 缓存同步 监听Canal实现缓存同步

weixin_43739821的博客 1221

Caffeine--缓存组件

推荐使用cache.get(key, k -> value)操作来在缓存中不存在该key对应的缓存元素的时候进行计算生成并直接写入至缓存内,而当该key对应的缓存元素存在的时候将会直接返回存在的缓存值。一次 cache.put(key, value) 操作将会直接写入或者更新缓存里的缓存元素,在缓存中已经存在的该key对应缓存值都会直接被覆盖。在基于权重驱逐的策略下,一个缓存元素的权重计算是在其创建和更新时,此后其权重值都是静态存在的,在两个元素之间进行权重的比较的时候,并不会根据进行相对权重的比较。

weixin_42592415的博客 2729

Caffeine本地缓存

Caffeine本地缓存的配置与使用

手把手教你用CODESYS将旧笔记本改造成软PLC(含证书配置避坑指南)

本文提供了一份详尽的指南,教你如何利用CODESYS平台将闲置旧笔记本改造为一台功能完整的软PLC。内容涵盖从硬件评估、系统实时性优化、软件安装与驱动配置,到关键的证书授权管理避坑指南,旨在帮助自动化工程师和爱好者低成本搭建稳定可靠的学习与开发平台。

weixin_29190573的博客 278

浅谈Caffeine缓存框架

浅谈Caffeine内存缓存框架

weixin_41184457的博客 4660

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

java缓存框架Caffeine详解

本地缓存是指将数据存储在设备的硬盘、内存或闪存中,通过空间换时间的策略来减少从远程服务器获取数据的时间和网络开销。Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能缓存库。可以说是目前最优秀的本地缓存,性能对比可以参考链接:。实际上,Caffeine和ConcurrentMap很像——支持并发,并且支持O(1)时间复杂度的数据存取。ConcurrentMap将存储所有存入的数据,直到你将其手动移除;Caffeine将通过给定的配置,自动移除“不常用”的数据,以保持内存的合理占用。

asxyxxx的博客 1万+

深入RK3588内存管理:如何用dma_buf_alloc和mpp_buffer为RGA2分配4G以内内存(附kernel版本选择)

本文深入探讨了RK3588平台上RGA2核心的4G内存限制问题,详细解析了dma_buf_alloc和mpp_buffer两种内存分配方案的技术细节与适用场景。通过代码示例和性能对比,帮助开发者优化高分辨率视频处理流程,并提供了内核版本选择与常见错误排查指南。

weixin_29168153的博客 364

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 318

本地缓存Caffeine

Caffine 是一款高性能的近似LFU(最近最少频率使用)准入策略的本地缓存组件,Caffeine的底层数据存储采用ConcurrentHashMap,使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率。适用范围:变更频率低、实时性要求低的数据之前的 removalListener 是异步监听,此处的 writer 方法可以设置同步监听器,同步监听器一个实现了接口 CacheWriter 的实例化对象,我们需要自定义接口的实现类。

m0_57801749的博客 1万+

【开关电源】开关电源实战经验分享

开关电源原理设计、Layout设计经验分享

weixin_42098658的博客 4166

Caffeine本地缓存框架

缓存(Cache),在软件无处不在。从底层CPU多级缓存,再到客户页面缓存,和服务器数据缓存,导出都存在着缓存的身影;从本质上讲,缓存是一种空间换时间的手段,一种计算完后,使下次进行访问数据,不再重复处理,节省时间整体的处理时间;针对Java而言,对应的常用缓存解决方案有很多,例如数据库缓存框架EhCache,分布式缓存Memcached/redis等,这些缓存方案实际上都是为了提升服务吞吐效率,避免持久层压力过大。对于常见缓存类型而言,可以分为本地缓存以及分布式缓存两种,Caffeine。

阿昌爱Java 1848

15. GD32E230定时器实战:基于TIMER5的1秒LED闪烁中断配置详解

本文详细讲解了如何在GD32E230微控制器上配置TIMER5定时器,实现精准的1秒LED闪烁中断。内容涵盖从时钟开启、参数计算、中断设置到服务函数编写的完整流程,重点解析了预分频值与周期值的配置方法,帮助开发者掌握硬件定时器的核心应用。

weixin_29092787的博客 134

【华为OD机试真题】7、字符串筛选排序 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引 如果有重复字母则输出字母的最小位置索引

KJ.JK 2266

Java 缓存框架 Caffeine 解析

Caffeine是由Google工程师Ben Manes开发的一款Java本地缓存框架,其初始版本发布于2014年。该框架的设计灵感来源于Guava Cache,但在性能和功能方面进行了革命性的优化。Caffeine基于"W-TinyLFU"(Window-Tiny Least Frequently Used)算法实现,这是一种改进的LFU缓存淘汰算法,结合了LFU的高命中率优势和LRU的时效性特点。

Toroto5的博客 1637

华为OD机试真题2025双机位C卷 Java&Go 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 392

缓存框架Caffeine探究

缓存框架Caffeine探究Java高性能本地缓存框架Caffeine依赖缓存加载手动加载CleanUp方法自动加载手动异步加载自动异步加载过期策略基于大小基于时间基于引用Caffeine.weakKeys()Caffeine.weakValues()Caffeine.softValues()刷新机制缓存移除invalidate(Object key)方法invalidateAll(Iterable<?> keys)方法invalidateAll()方法移除监听器(RemovalListener

m0_53157173的博客 4110

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Caffeine缓存指南

Caffeine是一个由Ben Manes开发的高性能缓存库,灵感来源于Guava Cache,并在其基础上进行了大量的性能优化。Caffeine提供了一种近乎最优的缓存解决方案,具有低延迟、高吞吐量、灵活配置等特点。支持多种缓存策略,如LRU、LFU等提供细粒度的过期控制和自动刷新机制内置统计监控功能,便于性能调优易于集成,提供简单直观的API缓存是一种常见的性能优化技术,通过在内存中存储经常访问的数据,减少对数据库或其他外部数据源的访问,从而提高系统的响应速度。缓存策略。

漫天飞雪 3378

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

caffeine本地缓存入门及实战

Caffeine是基于Java 8开发的高性能本地缓存库,设计目标是提供高吞吐量、低延迟的内存缓存解决方案。其核心改进源自Guava Cache,但通过优化并发控制(如StampedLock)和淘汰算法(Window-TinyLFU),性能显著提升。性能碾压:基于Window-TinyLFU算法,缓存命中率比LRU提升20%+;易用性:API设计简洁,与Spring无缝集成,支持注解式缓存;灵活性:覆盖本地缓存全场景需求(同步/异步加载、多维度过期策略)。

qq_23097225的博客 1679

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

本地缓存Caffeine从入门到原理剖析

自定义的缓存状态收集器的作用:每当缓存有操作发生时,不管是查询,加载,存入,都会使得缓存的某些状态指标发生改变,哪些状态指标发生了改变,就会自动触发收集器中对应的方法执行,如果我们在方法中自定义的代码是收集代码,比如将指标数值发送到 kafka,那么其它程序从kafka读取到数值,再进行分析与可视化展示,就能实现对缓存的实时监控了。收集器接口为 StatsCounter ,我们只需实现这个接口的所有抽象方法即可。下面举例说明。@Override。

m0_74229735的博客 1888

缓存框架jetcache+本地缓存Caffeine

jetcache框架

usa_washington的博客 2718

Java缓存框架Caffeine详解

Caffeine是一个基于Java 8+的现代化缓存库,其特点是高性能、内存友好和可扩展性强。它使用了许多优化技术来减少缓存的内存占用和提高缓存访问速度。Caffeine作为一个高性能的Java缓存框架,提供了丰富的功能和灵活的配置选项,可以显著提高应用程序的性能和响应速度。通过合理地利用其强大的特性,如灵活的缓存加载、事件监听和多种过期策略,可以更好地优化和管理数据的缓存。这些功能不仅可以提升系统的性能表现,也能够有效地降低对底层资源的压力。

Nanki_的博客 1764
上一篇: Hashmap的结构,1.7和1.8有哪些区别,深入的分析
下一篇: Netty线程模型详解
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值