Java 缓存介绍(Caffeine,EhCache)

缓存类型及优缺点:Ehcache、Caffeine、Memcached和Redis的比较 本文将对比分析四种常见的缓存类型:Ehcache、Caffeine、Memcached和Redis。通过探讨它们的优点、缺点以及适用场景,帮助读者更好地理解如何根据实际需求选择合适的缓存技术。同时,本文还将简要介绍这四种缓存类型支持的数据类型 阅读详情

Caffeine

一个高性能的缓存库,Caffeine 使用 Window TinyLfu 回收策略,可以提供了一个近乎最佳的命中率。

依赖

maven

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

Grade

compile 'com.github.ben-manes.caffeine:caffeine:2.5.5'
基本用法
		@Test
    public void baseTest() {
        Cache<String, Data> cache = Caffeine.newBuilder()
            // 设置过期时间
            .expireAfterWrite(1, TimeUnit.MINUTES)
            // 缓存数量
            .maximumSize(100).build();

        // 往缓存中设置 
        cache.put("A", new Data("A"));
        Assert.assertEquals(cache.getIfPresent("A").getData(), "A");

        // 取值 若存在返回 不存在返回null
        Data b = cache.getIfPresent("B");
        Assert.assertNull(b);

        // 取值 若不存在 则按后面计算并返回
        b = cache.get("B", k -> new Data(k));

        Assert.assertEquals(cache.getIfPresent("B").getData(), "B");

        // 手动移除key
        cache.invalidate("A");

        Assert.assertNull(cache.getIfPresent("A"));
    }
同步加载
		@Test
    public void syncLoadTest() {
        LoadingCache<String, Data> cache = Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .build(k -> new Data(k));

        //这个获取的仍然为空
        Assert.assertNull(cache.getIfPresent("A"));

        // get() 检索值 此处会根据初始化时指定的方法初始化value
        Data a = cache.get("a");
        Assert.assertNotNull(a);
        Assert.assertEquals(a.getData(),"a");

    }
异步加载
		@Test
    public void asyncLoadTest() {
        AsyncLoadingCache<String, Data> cache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(1, TimeUnit.MINUTES).buildAsync(k -> new Data(k));
        cache.get("A").thenAccept(data -> {
            Assert.assertNotNull(data);
            Assert.assertEquals(data.getData(), "a");
        });

    }

这3种加载方式使用的Cache类不同,可以根据自己的需求来选择合适的方式来加载数据

回收策略
  1. 基于maximumSize()设置的大小,若果超过最大值后将异步回收

  2. 基于权重大小删除元素

    1. .maximumWeight():指定缓存的最大容量,当缓存超出这个容量的时候,会使用Window TinyLfu策略来删除缓存
    2. .weighter((k,v)->{}):计算权重方法
    3. maximumWeight与maximumSize不可以同时使用。
  3. 基于时间回收

    1. 访问后到期 — 从上次读或写发生后,条目即过期
    2. 写入后到期 — 从上次写入发生之后,条目即过期
    3. 自定义策略 — 到期时间由 Expiry 实现独自计算
  4. 基于引用

    我们可以将缓存的驱逐配置成基于垃圾回收器。为此,我们可以将key 和 value 配置为弱引用或只将值配置成软引用。

    • Caffeine.weakKeys():使用弱引用存储key。如果没有其他地方对该key有强引用,那么该缓存就会被垃圾回收器回收。
    • Caffeine.weakValues():使用弱引用存储value。
    • Caffeine.softValues():使用软引用存储value。当内存满了过后,软引用的对象以将使用最近最少使用(least-recently-used ) 的方式进行垃圾回收。

Ehcache

​ Ehcache 从 Hibernate 发展而来,逐渐涵盖了 Cahce 界的全部功能,是目前发展势头最好的一个项目。具有快速,简单,低消耗,依赖性小,扩展性强,支持对象或序列化缓存,支持缓存或元素的失效,提供 LRU、LFU 和 FIFO 缓存策略,支持内存缓存和磁盘缓存,分布式缓存机制等等特点。

功能
  • 支持内存及磁盘存储
  • 多种缓存策略
  • 支持多缓存管理器实例,以及一个实例的多个缓存区域
缓存淘汰策略
  • FIFO:先进先出
  • LFU:最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存
  • LRU:最近最少使用,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存
依赖
maven 
<dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.7.0</version>
</dependency>

gradle
compile 'org.ehcache:ehchache:3.7.0'

基本用法
public class EhCache implements LocalCache<String, Data> {

    private CacheManager        cacheManager;

    private Cache<String, Data> cache;

    public EhCache() {
        // 创建缓存管理器 一个缓存管理器可以关联多个缓存
        cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build();
        // 初始化
        cacheManager.init();
        // 创建 dataCache缓存
        CacheConfigurationBuilder builder = CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Data.class, ResourcePoolsBuilder.heap(100));
        cache = cacheManager.createCache("dataCache", builder);

    }

    @Override
    public Data get(String K) {
        return cache.get(K);
    }

    @Override
    public void set(String K, Data data) {
        cache.put(K, data);
    }
}

2种缓存框架对比

特性

​ 从支持的功能上来看,ehcache支持的功能特性更多一些,比如多级缓存,分布式缓存,缓存监听器等等。但如果只是想简单的使用一个内存缓存组件,并且对性能有较高的要求时,可以优先考虑Caffeine,它的性能比ehcache更好,并且它使用了更加优秀的缓存淘汰策略,提供接近理想的命中率,在Spring5中已经作为基础的缓存组件使用了。

易用性

​ 从我简单使用上来看,Caffeine提供的api更友好一些,而且ehcache似乎没有提供异步加载特性。配置也略微烦琐了些。

性能

1 读多写少场景

测试条件

1.缓存1000个数据

2.8个线程读 2个线程写

Caffeine(读/写)Ehcache(读/写)
11558360022/1847731561794188434/155912462
21861119523/2884436761818122432/147250831
31421957913/2778566681348268819/142143289
平均1613812486/2503578331653526561/148435527
2 只读场景

测试条件

1.缓存1000个数据

2.10个线程读

Caffeine(读)Ehcache(读)
117236282252129962082
218990308852025097805
321246126642086497546
平均19157572582080519144

只读场景下Caffeine性能比Ehcache略微差一些。

总结

​ 在读性能上两者差距不大,但在写性能上Caffeine明显比Ehcache要高出不少。综合易用性,性能来看,我认为一般项目使用Caffeine就足够了。

Unity Android构建报错:compileSdk 35兼容性五层定位法 Android构建中的compileSdk是编译时API目标版本,其升级并非孤立操作,而是触发JDK、Android Gradle Plugin(AGP)、NDK、targetSdk与Unity引擎版本之间强耦合校验的起点。当出现'using a newer Android Gradle plugin to use compileSdk = 35'类报错,本质是代际技术栈错配——例如AGP 7.1.3不识别compileSdk 35所需Java 17语法,或NDK 21与AGP 7.4的ABI规范冲突。该问 阅读详情

相关推荐

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 546

guava、ehcache、caffeine

对于老的项目,如果使用了 Guava cache,想要升级为 Caffeine 的话,可以使用 Caffeine 提供的 Guava cache 适配器,方便的进行切换。否则运算、缓存、然后返回"。Google Guava Cache 是一种非常优秀本地缓存解决方案,提供了基于容量,时间和引用的缓存回收方式。Caffeine的 API 的操作功能和 Guava 是基本保持一致的,并且 Caffeine 为了兼容之前是Guava 的用户,做了一个 Guava 的 Adapter 给大家使用也是十分的贴心。

提供各种学习资源及帮助 1098

详解如何用爬虫工具批量采集阿里巴巴批发网商品数据

本文主要介绍如何使用后羿采集器的智能模式,免费采集阿里巴巴批发网商品的批发价格、发货时间、是否代发等信息。 采集字段: 商品标题、商品链接、图片链接、标签1、标签2、标签3、价格、30天成交数、 评价、店铺 功能点目录: 如何对采集字段进行配置 如何采集列表+详情页类型网页 采集结果预览: 下面我们来详细介绍一下如何免费采集1688批发网的商品数据,我们以“羽绒服女”为例,具体步骤如下: 步骤一...

weixin_43777427的博客 1万+

Java(JVM级别) 缓存介绍 ehcache、guava cache和Caffeine

在Java项目广泛的使用。它是一个开源的、设计于提高在数据从RDBMS中取出来的高花费、高延迟采取的一种缓存方案。正因为Ehcache具有健壮性(基于java开发)、被认证(具有apache 2.0 license)、充满特色(稍后会详细介绍),所以被用于大型复杂分布式web application的各个节点中。

ltd_201231的博客 762

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本征矩阵,单应矩阵梳理)附c++源码

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本质矩阵,单应矩阵梳理)附c++源码对极几何是什么,它有什么用(整体流程理解)对极约束(描述两相机关系)基础矩阵特性与求解方法本质矩阵特性与求解方法相机姿态恢复方法怎么又冒出了个单应矩阵H? 对极几何是什么,它有什么用(整体流程理解) 如图,当空间上有一个点分别在相机1和相机2上进行成像,这两个点存在什么变换关系呢?再扩展一下,真实世界下的场景分别用两个相机进行拍摄,获得两张照片,两张照片有什么变换关系呢?那么对极几何就是用来描述这种变换关系的。

qq_37764141的博客 5104

医药行业SAP序列号管理深度解析:如何满足GMP合规要求

本文深度解析了医药行业如何利用SAP序列号管理构建满足GMP合规要求的数字化追溯体系。文章详细阐述了SAP序列号在实现从生产到患者全流程“一物一码”精准追溯中的核心作用,并探讨了其与质量管理、冷链监控等系统的关键集成配置,为医药企业应对严格监管、保障产品质量与安全提供了切实可行的技术方案。

backprop5master的博客 655

玩转Spring Cache --- 整合进程缓存之王Caffeine Cache和Ehcache3.x【享学Spring】

前言 前面文章大篇幅详细讲解了Spring Cache缓存抽象、三大缓存注解的工作原理等等。若是细心的小伙伴会发现:讲解的是我使用的缓存实现方案均是Spring默认提供的:ConcurrentMapCache。它是spring-context内置的,无需额外导包就能使用。 但在实际开发过程中,Spring内建提供的实现显然是满足不了日益复杂的需求的,现实情况是很小有可能直接使用Concurrent...

架构师:通透,才能写出好代码! 5742

点云结构面智能识别与裂隙网络分析系统

点云结构面智能识别系统摘要 本系统采用深度学习与传统几何算法融合的方法,实现岩石结构面的智能识别与分析。系统包含7个核心模块:点云预处理、结构面识别、分组分割、参数计算、粗糙度分析、裂隙网络生成和可视化。技术路线结合PointNet++深度学习架构与RANSAC、区域生长等传统算法,通过预处理→深度学习识别→几何精修→参数计算→网络构建的流程实现高精度分析。预处理模块实现点云降噪、下采样和法向量估计,深度学习模块基于改进的PointNet++架构进行特征提取和分类。系统支持多种点云格式输入,提供完整的结构面

huanghm88的专栏 345

Java缓存技术(java内置缓存,redis,Ehcache,Caffeine的基本使用方法及其介绍)

此外,报告还介绍了几个广受欢迎的Java缓存框架,如Redis(高性能分布式内存缓存)、Ehcache(开源Java缓存框架,支持分布式缓存)以及Caffeine(高性能Java内存缓存库,专注于快速响应和高效内存利用)。简而言之,Java中的缓存技术是一种高效的数据处理策略,它利用内存的高速访问特性,为应用程序提供了快速的数据检索服务,从而提高了系统的响应速度和用户体验。在Java中,缓存的实现方式多样,包括利用本地数据结构实现的本地缓存、借助Java标准库提供的缓存功能。

m0_67725787的博客 3500

zemax---光学设计基础概念篇(持续更新中)

光学设计相关知识概念

u011699626的博客 1145

《QT+PCL》点云的点选与框选

【代码】《QT+PCL》点云的点选与框选。

阁楼 3602

Java 本地缓存实现:Guava Cache、Caffeine、Ehcache 和 Spring Cache

Guava Cache 是 Google Guava 库的一部分,提供了轻量级的本地缓存功能。它具有以下特点:简单易用:API 设计简洁,易于集成到项目中。自动回收:支持基于时间或引用的自动回收机制。并发支持:内置高效的并发控制,适合多线程环境。Caffeine 是一个高性能的本地缓存库,继承了 Guava Cache 的优点并进行了优化。它的特点包括:高性能:比 Guava Cache 更快,特别是在高并发环境下。

勤于笔记,成于点滴。 1812

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java本地高性能缓存的几种实现方式

Java本地高性能缓存的几种实现方式

吴名氏的博客 15万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java本地缓存框架Caffeine介绍

内存型缓存的理解:缓存都是使用内存作为存储媒介的,各种缓存服务的区别如下:Caffeine是内存型缓存是指缓存与调用者属于同一个应用,准确的说属于同一个JVM;若涉及多级缓存或者多种缓存共用,其它需要网络传输或者持久化的缓存需要序列化,Caffeine尽管也使用实现序列化的实体类,但是不做序列化操作。Caffeine是一个进程内部缓存框架,使用了Java 8最新的[StampedLock]乐观锁技术,极大提高缓存并发吞吐量,一个高性能的 Java 缓存库,被称为最快缓存。作为缓存数据库使用,持久化是标配。

weixin_57763462的博客 820

Camera2Demo

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

EhCache、GuavaCache和Caffeine之间的性能

Guava Cache Google Guava工具包是一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。Guava在每次访问缓存的时候判断cache数据是否过期,如果过期,这时才将其删除,并没有另起一个线程专门来删除过期数据。内部维护了2个队列accessQueue和writeQueue来记录缓存中数据访问和写入的顺序。访问缓存时,先用key计算出hash,从而找出所在的segment,然后再在segment中寻找具体数据,类似于使用ConcurrentHashMap数据结构来

搬砖老农工的博客 3103

【JavaWeb】缓存-Caffeine

通过使用Caffeine.recordStats()方法可以打开数据收集功能。Cache.stats()方法将会返回一个CacheStats对象,其将会含有一些统计指标,比如:hitRate(): 查询缓存的命中率evictionCount(): 被驱逐的缓存数量averageLoadPenalty(): 新值被载入的平均耗时配合SpringBoot提供的RESTful Controller,能很方便的查询Cache的使用情况。Caffeine提供了四种缓存添加策略。

精益求精 1652

Java高性能本地缓存框架Caffeine

一、序言 Caffeine是一个进程内部缓存框架,使用了Java 8最新的[StampedLock]乐观锁技术,极大提高缓存并发吞吐量,一个高性能的 Java 缓存库,被称为最快缓存。 二、缓存简介 (一)缓存对比 从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存:Redis、EhCache、Caffeine。 1、序列化 2、进程关系 内存型缓存的理解:缓存都是使用内存作为存储媒介的,各种缓存服务的区别如下:Caffeine是内存型缓存是指缓存与调用

V539413949的博客 1878

Java服务端分布式缓存:Caffeine与Ehcache的对比

Java服务端分布式缓存:Caffeine与Ehcache的对比 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在Java服务端开发中,分布式缓存是提高应用性能的重要手段。Caffeine和Ehcache是两个流行的Java缓存库,它们提供了丰富的缓存策略和高效的数据存储机制。本文将探...

weixin_40419927的博客 327

本地缓存组件Caffeine,与guava、map、ehcache对比

PS:Github Caffeine 介绍 Caffeine是一个基于Java8的高性能缓存库,提供了近乎最佳的命中率。 缓存与ConcurrentMap相似,但不完全相同。最根本的区别是ConcurrentMap将所有添加到其中的元素持久化,直到它们被显式删除。另一方面,缓存通常配置为自动逐出条目,以限制其内存占用。在某些情况下,如果缓存无法自动加载或逐出缓存项,则缓存加载会很有用。 Caffeine具有灵活的结构,可结合以下特点创建缓存: 自动将条目加载到缓存中,可以选择异步 基于频率和最.

进击的小白 5188

Caffeine缓存库

Caffeine是基于Java 8的高性能本地缓存库。它借鉴Google Guava Cache,改进不足,采用先进淘汰算法,不同访问模式下缓存命中率高。提供灵活配置和简洁 API,支持多过期策略、淘汰算法,还有异步加载、统计功能。

emmmm的博客 976

Caffeine本地缓存快速上手教程,通俗易懂

使用缓存的优点是可以减少直接访问数据库的压力。Caffeine是目前单机版缓存性能最高的,提供了最优的缓存命中率。用法和java中的map集合比较类似,底层使用一个ConcurrencyHashMap来保存所有数据,可以理解为一个增强版的map集合,增强的功能有设置缓存过期时间,缓存数据驱逐,统计缓存数据等。本文会大量使用详细的代码示例,通俗易懂地帮助大家学会使用Caffeine本地缓存。

RudeTomatoes的博客 3460

本地缓存Ehcache的应用实践 | 京东云技术团队

java本地缓存包含多个框架,其中常用的包括:Caffeine、Guava Cache和Ehcache, 其中Caffeine号称本地缓存之王,也是近年来被众多程序员推崇的缓存框架,同时也是SpringBoot内置的本地缓存实现。Ehcache的分布式实现并不可靠,核心还是采用广播集群方式,实现数据的同步及更新,并且性能受机器IO,磁盘,网络等影响,在实际应用情况下,不会比redis更好。**空闲时间:**缓存映射将在上次访问后的固定持续时间后过期;**生存周期:**缓存映射将在创建后的固定时间后过期;

JDDTechTalk的博客 1608
上一篇: Java中锁的原理介绍
IPanda_9527
博客等级 码龄9年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值