• Java本地缓存框架Caffeine介绍


     

    8d4f64349ca246f297e808f4194d2d71.jpgCaffeine是一个进程内部缓存框架,使用了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的内置版本即可。

     

        com.github.ben-manes.caffeine

        caffeine

        org.springframework

        spring-context-support

    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,此处仅配置过期时间的差异,其余配置可自由增加

  • 相关阅读:
    关于Google身份验证器、基于时间的一次性密码 (TOTP)算法的初步了解
    公司需要同步大量数据,如何缓解传输压力提高同步效率?
    如何使用透明贴图实现火焰效果
    分布式文件系统-minio
    Android WMS——概述(一)
    【仙逆】王林用计灭富二代,有长命锁也没用,藤化元一怒请一人出山
    解决pycharm安装opencv没有函数提醒的问题
    cumsum() R函数:用于产生随机变量的累积和
    Scala生成ip和Mac
    正则表达式的应用(前端写法)
  • 原文地址:https://blog.csdn.net/weixin_57763462/article/details/133219916