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不可以同時使用

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM