前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Caffeine缓存 最快缓存 内存缓存

Caffeine缓存 最快缓存 内存缓存

原创
作者头像
赛先生和泰先生
发布2022-01-21 10:44:58
3K0
发布2022-01-21 10:44:58
举报
文章被收录于专栏:Java知识图谱

一、序言

Caffeine是一个进程内部缓存框架。

对比Guava Cache

Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了Java 8最新的StampedLock锁技术。

二、缓存简介

(一)缓存对比

从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存: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的内置版本即可。

代码语言:javascript
复制
<dependency>
   <groupId>com.github.ben-manes.caffeine</groupId>
   <artifactId>caffeine</artifactId>
</dependency>
代码语言:javascript
复制
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
</dependency>
2、全局配置

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

代码语言:javascript
复制
spring:
cache:
  type: caffeine
3、缓存管理器

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

代码语言:javascript
复制
public interface CacheNameTimeConstant {
   String CACHE_DEFAULT = "CACHE_DEFAULT";
   String CACHE_10SECS = "CACHE_10SECS";
   String CACHE_60SECS = "CACHE_60SECS";
}

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

代码语言:java
复制
@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;
}

原文地址

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、序言
  • 二、缓存简介
    • (一)缓存对比
      • 1、序列化
      • 2、进程关系
    • (二)本地缓存
      • 1、Map
  • 三、SpringCache
    • (一)需求分析
      • 1、CacheManager
      • 2、CacheName
      • 3、Key
    • (二)序列化
      • (三)集成
        • 1、引入依赖
        • 2、全局配置
        • 3、缓存管理器
    相关产品与服务
    云数据库 Redis®
    腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档