Caffeine Cache Java缓存组件

news2025/1/5 10:56:58

缓存组件Caffeine Cache

  • 定义介绍
  • 整合springboot用法
  • 整合spring-boot-starter-cache用法

定义介绍

特性
高性能:基于高效并发设计和 TinyLFU 算法,命中率高。
丰富策略:支持容量限制、过期时间、异步加载、自定义清理策略。
统计监控:内置 recordStats 提供命中率等监控数据。
Spring 集成:支持与 Spring Cache 无缝对接。

优点
性能卓越,易用性强,配置灵活,内置监控,轻量级无额外依赖。

缺点
仅限本地缓存,无分布式支持,需手动管理内存,无持久化能力。
适用场景
单机高并发场景,如配置缓存、字典数据等频繁访问数据的缓存需求。

总结
Caffeine 是性能优异的本地缓存工具,但适用于单机场景,不支持分布式和持久化。

整合springboot用法

启动类加:@EnableCaching

@SpringBootApplication
@EnableCaching
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

1.导入依赖(springboot项目会自动管理版本)

        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
2.注入一个bean
@Configuration
public class CacheConfig {
    @Bean
    public Cache<String, Object> caffeineCache() {
        return Caffeine.newBuilder()
                // 设置最后一次写入或访问后经过固定时间过期
                .expireAfterWrite(60, TimeUnit.SECONDS)
                // 初始的缓存空间大小
                .initialCapacity(100)
                // 缓存的最大条数
                .maximumSize(1000)
                .build();
    }
}

3.使用


    @Autowired
    private Cache<String, Object> caffeineCache;

    public void test1(){
        String key = "";

        //获取key对应value,没有则获取计算值
        Object o = caffeineCache.get(key, (curKey) -> "compute Value");
        // 获取所有list中得key对应得值,返回一个map,否则返回计算map
        Map<String, Object> all = caffeineCache.getAll(new ArrayList<>(), (curkey) -> new HashMap<>());

        //获取值,没有返回null
        caffeineCache.getIfPresent(key);
        caffeineCache.getAllPresent(new ArrayList<>());

        //获取缓存所有值作为一个map
        ConcurrentMap<@NonNull String, @NonNull Object> map1 = caffeineCache.asMap();

        //删除指定key
        caffeineCache.invalidate(key);
        //删除所有指定key
        caffeineCache.invalidateAll(new ArrayList<>());
        //删除所有key
        caffeineCache.invalidateAll();

        //存值
        caffeineCache.put(key, "value");
        caffeineCache.putAll(new HashMap<>());

        //惰性执行,仅清理过期数据
        caffeineCache.cleanUp();

        //获取缓存中键值对的近似数量
        caffeineCache.estimatedSize();


        /**
         * 查询缓存中条目的额外信息
         * expireAfter(): 获取与过期策略相关的信息。
         * eviction(): 获取与驱逐策略相关的信息(如缓存的最大大小)。
         * refreshAfterWrite(): 获取与写后刷新相关的信息(如果配置了该策略)。
         */
        Policy<String, Object> policy = caffeineCache.policy();

        /**
         * 统计信息包括缓存命中率、加载成功率、驱逐条目数量
         * hitCount(): 缓存命中次数。
         * missCount(): 缓存未命中次数。
         * loadSuccessCount(): 成功加载新值的次数。
         * evictionCount(): 被驱逐的条目数量。
         */
        caffeineCache.stats();
    }

整合spring-boot-starter-cache用法

启动类加:@EnableCaching

@SpringBootApplication
@EnableCaching
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

1.导入依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>

2.yml配置

spring:
  cache:
    type: CAFFEINE # 指定使用 Caffeine 作为缓存类型
    caffeine:
      spec: maximumSize=1000,expireAfterWrite=10m,recordStats # 配置 Caffeine 缓存策略,采用 CacheBuilderSpec 的语法
      # maximumSize=1000: 设置缓存的最大容量为 1000 条记录,超出时采用最近最少使用(LRU)策略移除。
      # expireAfterWrite=10m: 设置缓存条目在写入后 10 分钟过期。
      # recordStats: 启用缓存统计功能,用于监控缓存的命中率、加载时间等数据。

3.用法和redis一样,用什么缓存用户是无感知的
查看:https://blog.csdn.net/m0_56182317/article/details/129871802?spm=1001.2014.3001.5501
即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2269226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA高级篇教学】第六篇:Springboot实现WebSocket

在 Spring Boot 中对接 WebSocket 是一个常见的场景&#xff0c;通常用于实现实时通信。以下是一个完整的 WebSocket 集成步骤&#xff0c;包括服务端和客户端的实现。本期做个简单的测试用例。 目录 一、WebSocket 简介 1. 什么是 WebSocket&#xff1f; 2. WebSocket 的特…

【YOLO 项目实战】(12)红外/可见光多模态目标检测

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】&#xff08;10&#xff09;YOLO8 环境配置与推理检测 【YOLO 项目实战】&#xff08;11&#xff09;YOLO8 数据集与模型训练 【YOLO 项目实战】&#xff08;12&#xff09;红外/可…

Ubuntu开机The root filesystem on /dev/sdbx requires a manual fsck 问题

出现“Manual fsck”错误可能由以下几种原因引起&#xff1a; 不正常关机&#xff1a;如果系统意外断电或被强制重启&#xff0c;文件系统可能未能正确卸载&#xff0c;导致文件系统损坏。磁盘故障&#xff1a;硬盘的物理损坏可能会引发文件系统错误。文件系统配置问题&#x…

RFSOC 47dr Dp口测试(ARM裸机)

47DR 内核还是一个4核A53的MPSOC&#xff0c;测试方式和MPSOC一样 首先设置好BD文件 编译好BIT设置VITIS工程 examle工程测试即可 但是本人硬件会跑飞不知道为何&#xff0c;通过注释掉下图的子函数得以解决 值得注意的是&#xff0c;最好用HP的线&#xff0c;不要用DP转…

protobuf: 通讯录2.1

先引入需要知道的proto3语法&#xff1a; 1.proto3 1.hexdump 作用&#xff1a; hexdump&#xff1a;是Linux下的⼀个⼆进制⽂件查看⼯具&#xff0c;它可以将⼆进制⽂件转换为ASCII、⼋进制、 ⼗进制、⼗六进制格式进⾏查看。 -C: 表⽰每个字节显⽰为16进制和相应的ASCI…

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务&#xff0c;特别是在夜间或忙碌时&#xff0c;减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例&#xff0c;满足不同年龄段婴…

职场常用Excel基础01-数据验证

大家好&#xff0c;excel在职场中使用非常频繁&#xff0c;今天和大家一起分享一下excel中数据验证相关的内容~ 在Excel中&#xff0c;数据验证&#xff08;Data Validation&#xff09;是一项非常有用的功能&#xff0c;它可以帮助用户限制输入到单元格中的数据类型和范围&am…

Kubernetes Gateway API-3-TLS配置

1 简介 Gateway API 允许使用多种方式配置 TLS。本文档列出了各种TLS设置,并给出了如何有效使用它们的一般指南。 尽管本文档涵盖了 Gateway API 最常见的TLS配置形式,但某些实现也可能提供特定于实现的扩展,允许不同或更高级形式的TLS配置。除此文档外,值得阅读你所使用…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…

3.CSS字体属性

3.1字体系列 CSS使用font-family属性定义文本的字体系列。 p{font-family:"微软雅黑"} div{font-family:Arial,"Microsoft Yahei",微软雅黑} 3.2字体大小 css使用font-size属性定义字体大小 p{ font-size:20px; } px(像素)大小是我们网页的最常用的单…

Spring-kafka快速Demo示例

使用Spring-Kafka快速发送/接受Kafka消息示例代码&#xff0c;项目结构是最基础的SpringBoot结构&#xff0c;提前安装好Kafka&#xff0c;确保Kafka已经正确启动 pom.xml&#xff0c;根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…

R语言统计分析——自助法BOOTSTRAP(1)

参考资料&#xff1a;R语言实战【第2版】 所谓自助法&#xff0c;即从初始样本重复随机替换抽样&#xff0c;生成一个或一系列待检验统计量的经验分布。无需假设一个特定的理论分布&#xff0c;便可生成统计量的置信区间&#xff0c;并能检验统计假设。 举个例子&#xff1a; 我…

yolo数据集格式(txt)转coco格式,方便mmyolo转标签格式

近期使用mmyolo过程中发现工具自带的yolo2coco.py在转换完数据集格式后&#xff0c;可视化标签的时候会有标签错乱情况&#xff0c;具体原因也没找到&#xff0c;肯定是转换过程代码有问题&#xff0c;于是重新做一份代码直接从yolo数据集转化为coco的json格式。 代码如下&…

sonarqube 安装及使用

一、官网参考地址 相关版本下载地址 配置全局变量 .bash_profileexport SONAR_HOME=/Users/jd/soft/sonar-scanner-6.2.1.4610 export PATH=$PATH:$SONAR_HOME/bin export SQ_HOST=http://127.0.0.1:9000/ export SQ_TOKEN=squ_dbb1913e095a92a727a918a9ba6b1af94b007748二、…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

Lua语言入门 - Lua常量

在Lua中&#xff0c;虽然没有直接的常量关键字&#xff08;如C中的const&#xff09;&#xff0c;但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法&#xff1a; 1. 使用全局变量并命名规范 你可以定义一个全局变量&#xff0c;并通过命名约定来表示…

【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0

从你提供的 nslookup 输出看&#xff0c;DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0&#xff0c;这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因&#xff1a; 可能的原因和解决方法 本地 DNS 问题&#xff1a; 有可能是你的本…

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…

Unity Excel转Json编辑器工具

功能说明&#xff1a;根据 .xlsx 文件生成对应的 JSON 文件&#xff0c;并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库&#xff0c;只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时&#xff0c;在 Editor 下再创建一个 Exc…

【竞技宝】CS2:HLTV2024职业选手排名TOP15-xantares

北京时间2024年12月30日&#xff0c;HLTV年度选手排名正在持续公布中&#xff0c;今日凌晨正式公布了今年的TOP15选手为EternalFire战队的xantares选手。 选手简介 xantares是一名来自于土耳其的CS职业选手&#xff0c;出生于1995年&#xff0c;今年已经29岁。早在2012年&…