zoukankan      html  css  js  c++  java
  • 007-spring cache-缓存实现-02-springboot ehcahe2、ehcache3实现、springboot caffeine实现

    一、springboot ehcahe3实现步骤

      EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。

      Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

    1.1、主要特性:

      快速、简单、多种缓存策略

      缓存数据有两级:内存和磁盘,因此无需担心容量问题
      缓存数据会在虚拟机重启的过程中写入磁盘
      可以通过RMI、可插入API等方式进行分布式缓存
      具有缓存和缓存管理器的侦听接口
      支持多缓存管理器实例,以及一个实例的多个缓存区域
      提供Hibernate的缓存实现

    注意:ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用

    1.2、和Redis比较:

      ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。

      redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。

      如果是单个应用或者对缓存访问要求很高的应用,用ehcache。如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

      ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

      ehcache3.x与2.x的差距还是非常大的,主要区别在于3.x后使用了java的缓存规范JSR107

    1.3、基础配置

    参看:001-spring cache 简介、基础使用

    参看:002-spring cache 基于声明式注解的缓存-01-Cacheable annotation

    参看上述两个配置

    代码地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache2
    代码地址:https://github.com/bjlhx15/common.git spring-cache/springboot2-cache-ehcache3

    二、springboot caffeine实现步骤

      Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代Guava。如果出现Caffeine,CaffeineCacheManager将会自动配置。使用spring.cache.cache-names属性可以在启动时创建缓存,并可以通过以下配置进行自定义(按顺序):

    • spring.cache.caffeine.spec: 定义的特殊缓存
    • com.github.benmanes.caffeine.cache.CaffeineSpec: bean定义
    • com.github.benmanes.caffeine.cache.Caffeine: bean定义

    代码地址:https://github.com/bjlhx15/common/tree/master/spring-cache/spring-cache-caffeine

    1、pom

    2、启动类注解

    3、业务类注解

    4、配置

    spring:
      cache:
        cache-names: user
        caffeine:
          spec: initialCapacity=50,maximumSize=500,expireAfterWrite=10s,refreshAfterWrite=5s

    其中spec配置参数

    initialCapacity=[integer]: 初始的缓存空间大小
    maximumSize=[long]: 缓存的最大条数
    maximumWeight=[long]: 缓存的最大权重
    expireAfterAccess=[duration]: 最后一次写入或访问后经过固定时间过期
    expireAfterWrite=[duration]: 最后一次写入后经过固定时间过期
    refreshAfterWrite=[duration]: 创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存
    weakKeys: 打开key的弱引用
    weakValues:打开value的弱引用
    softValues:打开value的软引用
    recordStats:开发统计功能

    注意:如果使用了refreshAfterWrite配置还必须指定一个CacheLoader,如:

    package com.lhx.spring.cache.caffeine;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.github.benmanes.caffeine.cache.CacheLoader;
    
    @Configuration
    public class CacheLoaderSelf {
        /**
         * 必须要指定这个Bean,refreshAfterWrite=5s这个配置属性才生效
         *
         */
        @Bean
        public CacheLoader<Object, Object> cacheLoader() {
            CacheLoader<Object, Object> cacheLoader = new CacheLoader<Object, Object>() {
                @Override
                public Object load(Object key) throws Exception {
                    return null;
                }
    
                // 重写这个方法将oldValue值返回回去,进而刷新缓存
                @Override
                public Object reload(Object key, Object oldValue) throws Exception {
                    return oldValue;
                }
            };
    
            return cacheLoader;
        }
    }

    注意:

    • expireAfterWrite和expireAfterAccess同事存在时,以expireAfterWrite为准。
    • maximumSize和maximumWeight不可以同时使用
    • weakValues和softValues不可以同时使用
     
  • 相关阅读:
    AD域服务器的部署 【1】— AD域介绍
    Docker 设置http代理
    在Django中将SQLite3数据库迁移到MySQL
    pycharm远程更新代码到远端服务器
    这个看着更好。Docker中使用MySQL
    docker换成最好用的源
    docker基础命令
    在docker中运行mysql实例
    centos7安装mysql
    centos 7 修改ip
  • 原文地址:https://www.cnblogs.com/bjlhx/p/9175523.html
Copyright © 2011-2022 走看看