ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ehcache的使用

2021-02-03 11:01:47  阅读:445  来源: 互联网

标签:Ehcache 10 String 配置文件 cache cacheManager ehcache 使用


这里着重说一下3.x的用法,至于2.x只说一下咋配置。

2.x

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

配置文件

需要在properties文件中指定对应的ehcache的配置文件。

以下是配置文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <defaultCache
            maxEntriesLocalHeap ="10000"
        eternal ="false"
        timeToIdleSeconds ="120"
        timeToLiveSeconds ="120"
        maxEntriesLocalDisk ="10000000"
        diskExpiryThreadIntervalSeconds ="120"
        memoryStoreEvictionPolicy = "LRU">
        <persistence strategy ="localTempSwap" />
    </defaultCache>
</ehcache>

代码

可以直接使用Spring框架的注解进行使用,也可以使用工具类,获取到对应的Cache来手动维护数据。

下面是工具类的代码:

public class CacheUtil {
    @Autowired
    private CacheManager cacheManager;

    public CacheUtil(CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }
    
    public void put(String cacheName, String key, String value) {
        Cache cache = cacheManager.getCache(cacheName);

        assert cache != null;
        cache.put(key, value);
    }
    
    public String get(String cacheName, String key) {
        Cache cache = cacheManager.getCache(cacheName);

        assert cache != null;

        return cache.get(key, String.class);

    }
    
}

3.x

依赖

Spring Boot使用3.x版本的形式发生了变化,原本是使用的ehcache的manager,在修改之后使用的是JSR107统一的manager,也需要额外添加一个依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
</dependency>

配置

同样,这个也需要在properties文件中指定配置文件的地址。

以下是一个简单的配置

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="
      http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
      http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">
    <service>
        <jsr107:defaults enable-statistics="true"/>
    </service>

    <cache alias="demo">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <heap unit="entries">100</heap>
    </cache>
</config>

配置文件

以下是我整理的配置文件的部分解释,详细的高级用法去官网

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="
      http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
      http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

    <service>
        <!-- 使用jsr的服务扩展-->
        <!-- default-template:是否使用-->
        <!-- jsr-107-compliant-atomics:是否使用-->
        <!-- enable-management:是否使用管理MBean-->
        <!-- enable-statistics:是否使用统计MBean-->
        <jsr107:defaults default-template="" jsr-107-compliant-atomics="false" enable-management="false" enable-statistics="true">
            <jsr107:cache name="" template=""/>
        </jsr107:defaults>
    </service>

    <!-- 配置线程池,注意,这个没有默认值-->
    <!-- alias:线程池的名称,后续引用的时候通过此名称引用-->
    <thread-pools>
        <thread-pool alias="" min-size="" max-size=""/>
    </thread-pools>
    <!-- 接下来用于发送事件的默认线程池-->
    <event-dispatch thread-pool=""/>
    <!--    配置接下来用于写工作的默认线程池-->
    <write-behind thread-pool=""/>
    <!--    配置用于磁盘存储的默认线程池-->
    <disk-store thread-pool=""/>

    <!-- 指定全局的对象复制方法-->
    <!-- 可以自定义对象复制器,需要实现接口Copier<T>-->
    <default-copiers>
        <copier type="">com.example.ehcachedemobase3.config.MyCopier</copier>
    </default-copiers>

    <!-- 指定全局的序列化方法,如果缓存中没有设置,使用此处的设置-->
    <!-- 默认情况下,支持自动化的处理,也可以自己实现序列化器,需要实现接口Serializer-->
    <default-serializers>
        <serializer type="">com.example.ehcachedemobase3.config.MySerializer</serializer>
    </default-serializers>

    <!-- 全局的堆存储设置-->
    <heap-store>
        <!-- 设置移动对象的时候需要遍历的最大对象数,默认是1000-->
        <max-object-graph-size>10</max-object-graph-size>
        <!-- 设置单个对象的最大大小, 默认是Long.MAX_VALUE-->
        <max-object-size unit="B">10</max-object-size>
    </heap-store>

    <!-- 指定持久化数据存储的位置-->
    <persistence directory=""/>

    <!-- 缓存配置的模板,可以在cache标签中使用属性uses-template引用-->
    <!-- 这个里面的标签,和cache的相同-->
    <cache-template name="simpleCache">
        <heap unit="entries">100</heap>
    </cache-template>


    <!-- 一个cache标签对应一个cache对象-->
    <!-- alias对应cacheName,可以通过这个属性的值获取到对应的cache-->
    <!-- uses-template属性对应模板的名称,可以将通用的属性抽取出来,创建一个cache-template-->
    <cache alias="demo" uses-template="simpleCache">
        <!-- 对应的键值对的类型,如果没有指定,默认为Object-->
        <!-- copier:指定使用的对象复制器,如果没指定,使用全局设置,值为对象拷贝器的全类名-->
        <!-- serializer:指定使用的序列化器,如果没有指定,使用全局设置的,值为序列化器的全类名-->
        <key-type copier="" serializer="">java.lang.String</key-type>
        <value-type copier="" serializer="">java.lang.String</value-type>

        <!-- 为磁盘存储指定特定的线程池-->
        <disk-store-settings disk-segments="16" thread-pool="" writer-concurrency="1"/>

        <!-- 设置到期类型及其参数-->
        <expiry>
            <!-- 指定自定义的过期方案,需要实现ExpiryPolicy接口-->
            <class>com.example.ehcachedemobase3.config.MyExpiryPolicy</class>
            <!-- 设置缓存永远不会到期-->
            <none/>
            <!-- 设置缓存生存时间-->
            <ttl unit="days">10</ttl>
            <!-- 设置缓存空闲时间-->
            <tti unit="days">10</tti>
        </expiry>

        <!-- 指定堆内可以存放多少数据-->
        <!-- unit属性代表单位,其中,entries指数据条数-->
        <heap unit="entries">10</heap>

        <!-- 堆存储的设置-->
        <heap-store-settings>
            <!-- 设置移动对象的时候需要遍历的最大对象数,默认是1000-->
            <max-object-graph-size>10</max-object-graph-size>
            <!-- 设置单个对象的最大大小, 默认是Long.MAX_VALUE-->
            <max-object-size unit="B">10</max-object-size>
        </heap-store-settings>

        <!-- 为缓存配置侦听器,该类需要实现接口CacheEventListener-->
        <!-- dispatcher-thread-pool:为当前缓存配置特定的线程池,用于发送事件-->
        <listeners  dispatcher-thread-pool="">com.example.ehcachedemobase3.config.MyCacheEventListener</listeners>

        <loader-writer>
            <!-- 对应处理方法的全类名,需要实现接口CacheLoaderWriter-->
            <class>com.example.ehcachedemobase3.config.MyCacheLoaderWriter</class>

            <!-- 配置后写-->
            <!-- thread-pool:为当前缓存配置特定的后写线程池-->
            <!-- concurrency:并发级别,指示将有多少个并行处理线程队列可以写在后面。实际上正在写的最大操作数是并发级别*队列大小-->
            <!-- size:队列大小,指示在对缓存操作之前可以有多少个挂起的写操作-->
            <write-behind thread-pool="" concurrency="" size="">
                <!-- batch-size:批次大小-->
                <!-- coalesce:合并-->
                <batching batch-size="" coalesce="true">
                    <!-- 最大写入延迟-->
                    <max-write-delay unit="days">1</max-write-delay>
                </batching>

                <non-batching/>
            </write-behind>
        </loader-writer>

        <!-- 配置在缓存的基础存储发生故障时使用的弹性策略-->
        <resilience></resilience>

        <resources>
            <!-- 指定此缓存在堆内存储的数据数量-->
            <heap unit="B">10</heap>
            <!-- 为了减轻JVM垃圾回收的压力,将部分数据存在堆外,但是仍在JVM的内存里面-->
            <!-- 指定此缓存在堆外存储数据的大小-->
            <offheap unit="B">19</offheap>
            <!-- 指定此缓存在磁盘上持久化存储数据的大小-->
            <disk unit="B" persistent="false"/>
        </resources>

        <!-- 指定当前缓存下的jsr107扩展服务配置-->
        <jsr107:mbeans enable-management="false" enable-statistics="false"/>

        <eviction-advisor>
        </eviction-advisor>
    </cache>

</config>

标签:Ehcache,10,String,配置文件,cache,cacheManager,ehcache,使用
来源: https://blog.csdn.net/weixin_45980031/article/details/113588372

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有