Java高性能本地缓存框架Caffeine的实现

目录
  • 一、序言
  • 二、缓存简介
    • (一)缓存对比
    • (二)本地缓存
  • 三、SpringCache
    • (一)需求分析
    • (二)序列化
    • (三)集成
  • 四、小结

一、序言

Caffeine是一个进程内部缓存框架,使用了Java 8最新的[StampedLock]乐观锁技术,极大提高缓存并发吞吐量,一个高性能的 Java 缓存库,被称为最快缓存。

二、缓存简介

(一)缓存对比

从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存:Redis、EhCache、Caffeine。

1、序列化

缓存 序列化 原因
Redis 必须实现序列化 进程间数据传输,因此必须实现序列化。大多数情况下涉及内网网络传输;作为缓存数据库使用,持久化是标配。
EhCache 不一定需要实现序列化 当缓存配置不持久化到磁盘时,无需实现序列化接口。使用时,如果不确定是否需要持久化到磁盘,建议统一实现序列化接口。
Caffeine 不需要实现序列化 Map对象的改进型接口,不涉及任何形式的网络传输和持久化,因此完全不需要实现序列化接口。

2、进程关系

缓存 进程关系 备注
Redis 与业务进程独立,由操作系统独立管理,业务系统重启对缓存服务无影响 Redis服务与业务服务独立,互相影响较小
EhCache 附着于业务进程,业务系统重启,存储与内存部分的缓存数据丢失;存储与硬盘部分的数据继续存在 缓存配置存在两种模式:一种是纯内存型,一种是可持久化到磁盘
Caffeine 附着于业务进程,业务系统重启,缓存数据全部丢失 纯内存型

内存型缓存的理解:缓存都是使用内存作为存储媒介的,各种缓存服务的区别如下:Caffeine是内存型缓存是指缓存与调用者属于同一个应用,准确的说属于同一个JVM;Redis是指另外一个独立进程的内存型,缓存数据存储在Redis数据库的内存中,而不是在调用服务所属的内存中。

(二)本地缓存

本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。

Caffeine是基于Guava Cache增强的新一代缓存技术,缓存性能极其出色。

1、Map

JDK内置的Map可作为缓存的一种实现方式,然而严格意义来讲,其不能算作缓存的范畴。原因如下:一是其存储的数据不能主动过期;二是无任何缓存淘汰策略。

三、SpringCache

Caffeine作为Spring体系中内置的缓存之一,Spring Cache同样提供调用接口支持。

(一)需求分析

1、CacheManager

Caffeine属于进程内部缓存框架,不需要配置多数据源,因此一个CacheManager即可满足需求。如果应用中仅使用Caffeine作为唯一的缓存框架,那么通过注解使用时无需显式指明。

2、CacheName

任何一类缓存,不同业务模块间缓存过期时间以及缓存淘汰策略几乎不相同,因此应该支持多CacheName,并且应该具有不同配置。过期时间是不同CacheName间缓存配置的重要区别。

3、Key

内存型缓存,无可视化界面,因此首要满足键值的唯一性,键值唯一是正确使用业务缓存的基础保证。

(二)序列化

Caffeine缓存不涉及任何序列化,因此目标缓存对象不需要实现Serializable接口。若涉及多级缓存或者多种缓存共用,其它需要网络传输或者持久化的缓存需要序列化,Caffeine尽管也使用实现序列化的实体类,但是不做序列化操作。

不需要序列化,降低了缓存使用难度。

(三)集成

1、引入依赖

如果无特别要求,使用较新SpringBoot的内置版本即可。

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
</dependency>

2、全局配置

全局配置中指定使用caffeine缓存管理。

spring:
  cache:
    type: caffeine

3、缓存管理器

配置缓存管理器:多CacheName配置。

public interface CacheNameTimeConstant {
    String CACHE_DEFAULT = "CACHE_DEFAULT";
    String CACHE_10SECS = "CACHE_10SECS";
    String CACHE_60SECS = "CACHE_60SECS";
}

同一个CacheManager配置多个CacheName,此处仅配置过期时间的差异,其余配置可自由增加。

@Bean
public CacheManager caffeineCacheManager() {
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    List<CaffeineCache> caches = new ArrayList<>();
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_5SECS,
            Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build()));
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_10SECS,
            Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build()));
    caches.add(new CaffeineCache(CacheNameTimeConstant.CACHE_30SECS,
            Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build()));
    cacheManager.setCaches(caches);
    return cacheManager;
}

四、小结

Java领域可用的缓存框架非常多,Caffeine不属于分布式缓存,但不影响其在本地缓存场景出色的表现。开发者在进行缓存架构设计时需要综合考虑各类缓存的优缺点,依据具体场景选配相应缓存。

到此这篇关于Java高性能本地缓存框架Caffeine的实现的文章就介绍到这了,更多相关Java Caffeine内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 轻松了解java中Caffeine高性能缓存库

    目录 轻松lCaffeine 1.依赖 2.写入缓存 2.1.手动写入 2.2.同步加载 2.3.异步加载 3.缓存值的清理 3.1.基于大小的清理 3.2.基于时间的清理 3.3.基于引用的清理 4.缓存刷新 5.统计 轻松lCaffeine 1.依赖 我们需要将Caffeine依赖添加到我们的pom.xml中: <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId&g

  • 详细介绍高性能Java缓存库Caffeine

    1.介绍 在本文中,我们来看看Caffeine- 一个高性能的 Java 缓存库. 缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item. 回收策略为在指定时间删除哪些对象.此策略直接影响缓存的命中率 - 缓存库的一个重要特征. Caffeine 因使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率. 2.依赖 我们需要在 pom.xml 中添加 caffeine 依赖: <dependency> <groupId>com.github.ben-

  • Java高性能本地缓存框架Caffeine的实现

    目录 一.序言 二.缓存简介 (一)缓存对比 (二)本地缓存 三.SpringCache (一)需求分析 (二)序列化 (三)集成 四.小结 一.序言 Caffeine是一个进程内部缓存框架,使用了Java 8最新的[StampedLock]乐观锁技术,极大提高缓存并发吞吐量,一个高性能的 Java 缓存库,被称为最快缓存. 二.缓存简介 (一)缓存对比 从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性.下面对比三种常用缓存:Redis.EhCache.Caffei

  • Spring Boot 2.x 把 Guava 干掉了选择本地缓存之王 Caffeine(推荐)

    环境配置: JDK 版本:1.8 Caffeine 版本:2.8.0 SpringBoot 版本:2.2.2.RELEASE 一.本地缓存介绍 缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力. 之前介绍过 Redis 这种 NoSql 作为缓存组件,它能够很好的作为分布式缓存组件提供多个服务间的缓存,但是 Redis 这种还是需要网络开销,增加时耗.本地缓存是直接从本地内存中读取,没有网络开销,例如秒杀系统或者数据量小

  • Java MyBatis本地缓存原理详解

    目录 背景 发现问题 复现 解决问题 探究缓存的原理 Sql查询部分深入 初见缓存 告一段落 番外篇-Myabtis创建CacheKey的算法. 构造方法 结束语 背景 出现了一次生产事故,事情是这样的,我们有一个项目,Java访问数据库的框架使用的是MyBatis.然后一个业务员在系统中查询了一个订单,发现这个订单是未支付的状态,于是业务员联系客户,让客户支付,客户支付完成后,业务员又去系统查询,结果还是未支付状态,刷新了页面也是一样,不过过了一会就好了.业务员把这个延迟问题,反馈给了我们.我

  • Java进程内缓存框架EhCache详解

    目录 一:目录 二: 简介 2.1.基本介绍 2.2.主要的特性 2.3. 集成 2.4. ehcache 和 redis 比较 三:事例 3.1.在pom.xml中引入依赖 3.2.在src/main/resources/创建一个配置文件 ehcache.xml 3.3.测试类 3.4.缓存配置 一:xml配置方式: 二:编程方式配置 3.5.Ehcache API 四:Spring整合 4.1.pom.xml 引入spring和ehcache 4.2.在src/main/resources添

  • Java LocalCache 本地缓存的实现实例

    源码地址: GitHub 使用场景 在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中.相对从数据库中读取来说,读缓存效率会有很大提升. 在集群环境下,常用的分布式缓存有Redis.Memcached等.但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache). 实现 这里提供了两种LocalCache的实现,一种是基于ConcurrentHashMap实现基本本地缓存,另外一种是基于Linked

  • Java本地缓存工具之LoadingCache的使用详解

    目录 前言 环境依赖 代码 演示一下 总结 前言 在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存.本文提供一个我在工作中用到的缓存工具,该工具代码为了演示做了一些调整.如果拿去使用的话,可以考虑做成注入Bean对象,看具体需求了. 环境依赖 先添加maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</arti

  • Java基于LoadingCache实现本地缓存的示例代码

    目录 一. 添加 maven 依赖 二.CacheBuilder 方法说明 三.创建 CacheLoader 四.工具类 五.guava Cache数据移除 一. 添加 maven 依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>27.1-jre</version> </depend

  • ehcache开源缓存框架_动力节点Java学院整理

    Ehcache是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google:对于API,官网上介绍已经非常清楚,请参见官网:但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获. 一.特性一览,来自官网,简单翻译一下:  1.快速轻量 过去几年,

  • SpringBoot集成本地缓存性能之王Caffeine示例详解

    目录 引言 Spring Cache 是什么 集成 Caffeine 核心原理 引言 使用缓存的目的就是提高性能,今天码哥带大家实践运用 spring-boot-starter-cache 抽象的缓存组件去集成本地缓存性能之王 Caffeine. 大家需要注意的是:in-memeory 缓存只适合在单体应用,不适合与分布式环境. 分布式环境的情况下需要将缓存修改同步到每个节点,需要一个同步机制保证每个节点缓存数据最终一致. Spring Cache 是什么 不使用 Spring Cache 抽象

  • Java中LocalCache本地缓存实现代码

    前言 本次分享探讨java平台的本地缓存,是指占用JVM的heap区域来缓冲存储数据的缓存组件. 一.本地缓存应用场景 localcache有着极大的性能优势: 1. 单机情况下适当使用localcache会使应用的性能得到很大的提升. 2. 集群环境下对于敏感性要求不高的数据可以使用localcache,只配置简单的失效机制来保证数据的相对一致性. 哪些数据可以存储到本地缓存? 1.访问频繁的数据: 2.静态基础数据(长时间内不变的数据): 3.相对静态数据(短时间内不变的数据). 二.jav

随机推荐