知识养成了思想,思想同时又在融化知识。这篇文章主要讲述Caffeine缓存 最快缓存 内存缓存相关的知识,希望能为你提供帮助。
文章图片
一、序言
Caffeine是一个进程内部缓存框架。
对比Guava CacheCaffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了java 8最新的StampedLock锁技术。
二、缓存简介
(一)缓存对比从横向对常用的缓存进行对比,有助于加深对缓存的理解,有助于提高技术选型的合理性。下面对比三种常用缓存:Redis、EhCache、Caffeine。
1、序列化
缓存 | 序列化 | 原因 |
---|---|---|
Redis | 必须实现序列化 | 进程间数据传输,因此必须实现序列化。大多数情况下涉及内网网络传输;作为缓存数据库使用,持久化是标配。 |
EhCache | 不一定需要实现序列化 | 当缓存配置不持久化到磁盘时,无需实现序列化接口。使用时,如果不确定是否需要持久化到磁盘,建议统一实现序列化接口。 |
Caffeine | 不需要实现序列化 | Map对象的改进型接口,不涉及任何形式的网络传输和持久化,因此完全不需要实现序列化接口。 |
缓存 | 进程关系 | 备注 |
---|---|---|
Redis | 与业务进程独立,由操作系统独立管理,业务系统重启对缓存服务无影响 | Redis服务与业务服务独立,互相影响较小 |
EhCache | 附着于业务进程,业务系统重启,存储与内存部分的缓存数据丢失;存储与硬盘部分的数据继续存在 | 缓存配置存在两种模式:一种是纯内存型,一种是可持久化到磁盘 |
Caffeine | 附着于业务进程,业务系统重启,缓存数据全部丢失 | 纯内存型 |
(二)本地缓存本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。
Caffeine是基于Guava Cache增强的新一代缓存技术,缓存性能极其出色。
1、MapJDK内置的Map可作为缓存的一种实现方式,然而严格意义来讲,其不能算作缓存的范畴。原因如下:一是其存储的数据不能主动过期;二是无任何缓存淘汰策略。
三、SpringCache
Caffeine作为Spring体系中内置的缓存之一,Spring Cache同样提供调用接口支持。
(一)需求分析 1、CacheManagerCaffeine属于进程内部缓存框架,不需要配置多数据源,因此一个
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、缓存管理器【Caffeine缓存 最快缓存 内存缓存】配置缓存管理器:多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;
原文地址
推荐阅读
- 学了那么多NoSQL数据库!NoSQL究竟是啥()
- 这样使用 IDEA ,效率提升10倍!| IDEA 高效使用指南
- netty系列之:可以自动通知执行结果的Future,有见过吗()
- Apache Calcite进行SQL解析
- LVS+Keppalived群集
- 想进阿里腾讯等互联网公司(没懂这些 Java 并发编程怎么行)
- hadoop+zookeeper+kafka集群搭建
- 为什么Java接口不能有构造函数而抽象类可以有()
- 为什么在C++中空类的大小不为零()