spring boot 整合 ehcache

spring boot 整合 ehcache

目前java的缓存框架有很多,比如:Ehcache、Cacheonix、JBoss Cache、OSCache、Memcached和Redis等,这里就单独列出EhCache、memcached和Redis来进行比较,并实现EhCache。

比较常用的缓存框架

redis memcached ehcache
开发难易 适中 简单 快速、简单
分布式支持 支持 支持 不完善
过期设置 支持 支持 支持
持久化 支持 不支持 支持
缓存速度 很高
spring兼容 兼容性好 一般 兼容性好
github
使用方式 socket socket jvm
数据结构 多数据结构 string 多数据结构

各框架应用场景:

  • ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
  • redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。
  • memcached给予内存的key-value的存储,简洁强大,适合大型的分布式系统,但不能数据持久化

在Ehcache中对于缓存的存储主要有三种方式:分别是堆内存、非堆内存和磁盘。其中非堆内存是针对于企业版Ehcache才有的功能,它可以不受Java GC的影响,能够创建很大的缓存。

spring boot 整合 echcache

第一步:pom.xml 依赖

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-cacheartifactId>
dependency>
<dependency>
	<groupId>net.sf.ehcachegroupId>
	<artifactId>ehcacheartifactId>
dependency>

第二步:在resources文件夹中创建ehcache.xml配置文件


<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
	 
    <diskStore path="java.io.tmpdir" />
  
    <defaultCache maxElementsInMemory="10000" eternal="false"
                  timeToIdleSeconds="600" 
                  timeToLiveSeconds="600" overflowToDisk="true" />

    
    <cache name="userCache" 
           maxElementsInMemory="10000" 
           eternal="false"
           timeToIdleSeconds="180" 
           timeToLiveSeconds="7200" 
           overflowToDisk="true" />

ehcache>

       

参数说明

  • maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象。若放入Cache中的元素超过这个数值,则有以下两种情况
    1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中
    2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素
  • eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期)
  • timeToIdleSeconds:当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除;即缓存自创建日期起能够存活的最长时间,单位为秒(s)
  • timeToLiveSeconds:当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空;即缓存被创建后,最后一次访问时间到缓存失效之时,两者之间的间隔,单位为秒(s)
  • overflowToDisk:是否允许对象被写入到磁盘
  • maxElementsOnDisk : 磁盘缓存中最多可以存放的元素数量,0表示无穷大
  • diskExpiryThreadIntervalSeconds:磁盘缓存的清理线程运行间隔,默认是120秒
  • memoryStoreEvictionPolicy:内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)

第三步:spring boot 配置文件application.properties(application.yml)中加入配置项

spring.cache.ehcache.config=classpath:ehcache.xml
或
spring:
    cache:
        ehcache:
            config: classpath:ehcache.xml
        type: ehcache

第四步:spring boot开启缓存机制

在启动类上加入@EnableCaching,启动类启动时会去启动缓存启动器。

第五步:简单使用

@Override
@Cacheable(value = "userCache", key = "#id")
public Integer saveCache(Integer id) {

    return id;
}


@Override
@Cacheable(value = "userCache", key = "#id")
public Integer selectCache(Integer id) {
    return null;
}

userCache是ehcache.xml配置文件中的策略名,如果没有填写,则使用默认缓存策略。

@Cacheable使用

有几个属性:key、value、condition,

key:缓存对应的数据的主键

value:策略名称,对应的是配置ehcache.xml中的,cache名

其中condition中使用的是SPEL语句

@CachePut使用

配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。它的参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数的解析

@CacheEvict使用

标注在需要清除缓存元素的方法或类上,清除缓存,同样有key、value和condition属性

封装ehcache工具类

package com.newgrand.real.name.management.util;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 类  名:com.newgrand.real.name.management.util.EhcacheUtil
 * 类描述:ehcache工具类
 * 创建人:liurui
 * 创建时间:2020/8/5 14:59
 * 修改人:
 * 修改时间:
 * 修改备注:
 *
 * @author liurui
 * @version 1.0
 */
@Component
public class EhcacheUtil {
    @Autowired
    @Lazy
    private CacheManager cacheManager;

    public final static String PASS_CACHE =  "passCache";

    /**
     * 缓存数据
     * @Author liurui
     * @Description 缓存字符串
     * @Date 16:00 2020/8/5
     * @param cacheName
     * @param key
     * @param value
     * @return void
     **/
    public void set(String cacheName, String key, Object value) {
        Cache cache = cacheManager.getCache(cacheName);
        Element element = new Element(
                key, value);
        cache.put(element);

    }

    /**
     * 获取缓存内容
     * @Author liurui
     * @Description 获取缓存内容
     * @Date 16:01 2020/8/5
     * @param cacheName
     * @param key
     * @return java.lang.Object
     **/
    public Object get(String cacheName, String key) {
        Cache cache = cacheManager.getCache(cacheName);
        Element element = cache.get(key);

        if(element == null){
            return null;
        }
        return element.getObjectValue();
    }

    /**
     * 获取指定策略模式的所有主键
     * @Author liurui
     * @Description 获取指定策略模式的所有主键
     * @Date 16:02 2020/8/5
     * @param cacheName
     * @return java.util.List
     **/
    public List<String> getKeys(String cacheName) {
        Cache cache = cacheManager.getCache(cacheName);
        return cache.getKeys();
    }
}

你可能感兴趣的:(spring,boot,java,spring,java)