ehcache 使用笔记

要想使用 java 的本地缓存,可以考虑用 ehcache,或者 guava。

guava 更高端一点,可以自动定时刷新。我选择了 ehcache。

在 spring 中是集成了 ehcache 的。要使用 ehcache 的话,只需要下面几步:

当然需要首先引入 ehcache 相关的 jar 包。可以采用配置 pom 文件使用 maven 依赖的方式。

一、在 spring 的 applicationContext.xml 配置文件中配置好 ehcache 相关的 bean

    <!-- ehcache -->
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="spring/ehcache.xml"/>
    </bean>
    <bean id="manager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="cacheManagerFactory"/>
    </bean>

二、配置好 ehcache.xml

<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>

    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
    <!--
        配置自定义缓存
        maxElementsInMemory:缓存中允许创建的最大对象数
        eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
        timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
                    两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
                    如果该值是 0 就意味着元素可以停顿无穷长的时间。
        timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
                    这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
        overflowToDisk:内存不足时,是否启用磁盘缓存。
        memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
    -->
    <cache name="TerritoryCache"
        maxElementsInMemory="10000"
        eternal="false"
        overflowToDisk="false"
        timeToIdleSeconds="900"
        timeToLiveSeconds="1800"
        memoryStoreEvictionPolicy="LFU" />

</ehcache>

三、具体类中使用 CacheManager

@Component
public class TerritoryRangeCache {
    @Autowired
    EhCacheCacheManager manager;

    @Autowired
    TerritoryRangeDao territoryRangeDao;

    Cache cache;

    public Object getAllTerritorRanges(String key) {

      cache = manager.getCacheManager().getCache("TerritoryCache");

        Object value = cache.get(key);
        if (value == null) {
            cache.putIfAbsent(new Element(key, territoryRangeDao.selectAll()));
            return cache.get(key).getObjectValue();
        }
        return cache.get(key).getObjectKey();
    }
}

其实具体类中使用注入的 EhCacheCacheManager 是 spring 自己封装过了的 CacheManager。要想获取引入的 ehCache 包里面的 CacheManager 的话,需要把spring 包装过的EhCacheCacheManager通过 getManager 拿出来。我们来看先EhCacheCacheManager的源码:

public class EhCacheCacheManager extends AbstractTransactionSupportingCacheManager {

    private net.sf.ehcache.CacheManager cacheManager;

    /**
     * Create a new EhCacheCacheManager, setting the target EhCache CacheManager
     * through the {@link #setCacheManager} bean property.
     */
    public EhCacheCacheManager() {
    }

    /**
     * Create a new EhCacheCacheManager for the given backing EhCache CacheManager.
     * @param cacheManager the backing EhCache {@link net.sf.ehcache.CacheManager}
     */
    public EhCacheCacheManager(net.sf.ehcache.CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    /**
     * Set the backing EhCache {@link net.sf.ehcache.CacheManager}.
     */
    public void setCacheManager(net.sf.ehcache.CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    /**
     * Return the backing EhCache {@link net.sf.ehcache.CacheManager}.
     */
    public net.sf.ehcache.CacheManager getCacheManager() {
        return this.cacheManager;
    }
……
}

四、ehcaceh 的定时刷新,可以自己写一个方法,来更新缓存中的数据:

  @Scheduled(cron = " ")
    @PostConstruct
    public void refreshAll() {
        cache = manager.getCacheManager().getCache("key");
        getAllTerritorRanges("territory_range");
    }

可以加上上面的方法,来通过 cron 表达式中传入的参数来定时刷新缓存中的数据。

关于@PostConstruct的使用以及含义,会在我的另一篇博文中介绍~。可以先看下这个注解的源码:

package javax.annotation;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

/**
 * The PostConstruct annotation is used on a method that needs to be executed
 * after dependency injection is done to perform any initialization. This
 * method MUST be invoked before the class is put into service. This
 * annotation MUST be supported on all classes that support dependency
 * injection. The method annotated with PostConstruct MUST be invoked even
 * if the class does not request any resources to be injected. Only one
 * method can be annotated with this annotation. The method on which the
 * PostConstruct annotation is applied MUST fulfill all of the following
 * criteria -
- The method MUST NOT have any parameters except in the case of EJB
 * interceptors   in which case it takes an InvocationC ontext object as
 * defined by the EJB   specification.
 * - The return type of the method MUST be void.
 * - The method MUST NOT throw a checked exception.
 * - The method on which PostConstruct is applied MAY be public, protected,
 * package private or private.
 * - The method MUST NOT be static except for the application client.
 * - The method MAY be final.
 * - If the method throws an unchecked exception the class MUST NOT be put into
 * service except in the case of EJBs where the EJB can handle exceptions and
 * even   recover from them.
 * @since Common Annotations 1.0
 * @see javax.annotation.PreDestroy
 * @see javax.annotation.Resource
 */
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}

时间: 2024-10-04 13:05:08

ehcache 使用笔记的相关文章

EHCache学习笔记

介绍: EHCache 是一个快速的.轻量级的.易于使用的.进程内的缓存.它支持 read-only 和 read/write 缓存,内存和磁盘缓存.是一个非常轻量级的缓存实现,而且从 1.2 之后就支持了集群. 配置: EHCache的配置非常灵活,可以在声明里配置,也可以在xml.程序中.构造函数中配置.下面在程序中动态的改变Cache的配置,如下: Cache cache = manager.getCache("sampleCache");CacheConfiguration c

Ehcache学习笔记——初识Ehcache

1. Ehcache 的主要特性和集群方案 EHCache EHCache 是一个纯 java 的在进程中的缓存,是 Hibernate 中默认的 CacheProvider,最小的依赖性, 全面的文档和测试,最新版本为 2.0.1. 缓存应用在多个领域并发挥作用,ehcache 可应用于数据库访问缓存,安全认证缓存,web 缓存,soap 和 RESTFul 服务缓存,应用程序持久对象缓存以及分布式缓存. (1)EhCache 的主要特性有: a) 快速: b) 简单: c)多种缓存策略: d

Cache学习笔记汇总

鲁春利的工作笔记,好记性不如烂笔头 Ehcache学习笔记(一)基础入门 http://luchunli.blog.51cto.com/2368057/1726800 Ehcache学习笔记(二)基础入门

mybatis学习笔记(14)-mybatis整合ehcache

mybatis学习笔记(14)-mybatis整合ehcache mybatis学习笔记14-mybatis整合ehcache 分布缓存 整合方法掌握 整合ehcache 加入ehcache的配置文件 ehcache是一个分布式缓存框架 分布缓存 我们系统为了提高系统并发,性能.一般对系统进行分布式部署(集群部署方式) 不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发.所以要使用分布式缓存对缓存数据进行集中管理. mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合.

spring学习笔记(26)——spring整合ehcache

ehcache配置文件 spring配置文件中配置 使用 ehcache配置文件 在src下创建ehcache.xml <?xml version="1.0" encoding="UTF-8"?> <ehcache name="es"> <diskStore path="java.io.tmpdir"/> <!-- name属性是根据需要自行取名 --> <!-- cach

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

shiro学习笔记_0100_shiro简介

前言:第一次知道shiro是2016年夏天,做项目时候我要写springmvc的拦截器,申哥看到后,说这个不安全,就给我捣鼓了shiro,我就看了下,从此认识了shiro.此笔记是根据网上的视频教程记录的,shiro的文档感觉不是很好,所以结合老师的讲课和文档,感觉条理更清晰些.以便日后查阅 shiro:Shiro是一个基于java的开源的安全管理框架. Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等可用于javase和javaee,还可用于分布式集群环境. 在ja

马士兵hibernate(原始笔记)

马士兵hibernate(原始笔记) 课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3        常见的0/R框架(了解) 4        hibernate基础配置(重点) 5        ID生成策略(重点 AUTO) 6        Hibernate核心开发接口介绍(重点) 7        对象的三种状态(了

Memcached理解笔记3---Memcached使用总结

为了将N个前端数据同步,通过Memcached完成数据打通,但带来了一些新问题: 使用iBatis整合了Memcached,iBatis针对每台server生成了唯一标识,导致同一份数据sql会产生不同的key,造成重复缓存.——通过重写iBatis部分原码,终止了唯一标识的生成,同一个SQL产生同一个Key,同时对生成key做hash,控制长度,使得数据统一在Memcached. 为了迎合iBatis的架构,通过CacheModel模式,对缓存数据分组管理.最初通过Map实现CacheMode