1.添加 pom.xml 依赖

    1. <!-- caching -->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-cache</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>net.sf.ehcache</groupId>
    8. <artifactId>ehcache</artifactId>
    9. </dependency>

    2.配置属性

    1. spring.cache.type=ehcache
    2. spring.cache.ehcache.config=classpath:config/ehcache.xml

    3.ehcache.xml

    1. <!--
    2. diskStore path:用来配置磁盘缓存使用的物理路径
    3. name: 缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里)
    4. eternal="false" 元素是否永恒,如果是就永不过期(必须设置)
    5. maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大
    6. maxElementsInMemory="1000" 内存缓存中最多可以存放的元素数量(必须设置)
    7. timeToIdleSeconds="0" 导致元素过期的访问间隔(秒为单位). 0表示可以永远空闲,默认为0
    8. timeToLiveSeconds="600" 元素在缓存里存在的时间(秒为单位). 0 表示永远存在不过期
    9. overflowToDisk="false" 当缓存达到maxElementsInMemory值是,是否允许溢出到磁盘(必须设置)
    10. diskPersistent="false" 磁盘缓存在VM重新启动时是否保持(默认为false)
    11. diskExpiryThreadIntervalSeconds="100" 磁盘失效线程运行时间间隔,默认是120秒
    12. memoryStoreEvictionPolicy="LFU" 内存存储与释放策略.当达到maxElementsInMemory时
    13. 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出)默认使用"最近使用"策略
    14. -->
    1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    2. <cache name="roncooCache" eternal="false" maxEntriesLocalHeap="0" timeToIdleSeconds="200"></cache>
    3. <!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false -->
    4. <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
    5. <!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 -->
    6. </ehcache>

    4.启用注解

    在 Spring Boot 的启动类(Application)中增加如下注解:
    @EnableCaching:启用缓存注解

    5.实现例子

    1. public interface UserLogCache {
    2. /**
    3. * 查询
    4. *
    5. * @param id
    6. * @return
    7. */
    8. RoncooUserLog selectById(Integer id);
    9. /**
    10. * 更新
    11. *
    12. * @param roncooUserLog
    13. * @return
    14. */
    15. RoncooUserLog updateById(RoncooUserLog roncooUserLog);
    16. /**
    17. * 删除
    18. *
    19. * @param id
    20. * @return
    21. */
    22. String deleteById(Integer id);
    23. }
    24. @CacheConfig(cacheNames = "userCache")
    25. @Repository
    26. public class UserLogCacheImpl implements UserLogCache {
    27. @Autowired
    28. private RoncooUserLogDao roncooUserLogDao;
    29. @Cacheable(key = "#p0")
    30. @Override
    31. public RoncooUserLog selectById(Integer id) {
    32. System.out.println("查询功能,缓存找不到,直接读库, id=" + id);
    33. return roncooUserLogDao.findOne(id);
    34. }
    35. @CachePut(key = "#p0")
    36. @Override
    37. public RoncooUserLog updateById(RoncooUserLog roncooUserLog) {
    38. System.out.println("更新功能,更新缓存,直接写库, id=" + roncooUserLog);
    39. return roncooUserLogDao.save(roncooUserLog);
    40. }
    41. @CacheEvict(key = "#p0")
    42. @Override
    43. public String deleteById(Integer id) {
    44. System.out.println("删除功能,删除缓存,直接写库, id=" + id);
    45. return "清空缓存成功";
    46. }
    47. }

    6.注解说明

    • @CacheConfig:缓存配置;
    • @Cacheable:应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中,适用于查找;
    • @CachePut:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用,适用于更新和插入;
    • @CacheEvict:主要针对方法配置,能够根据一定的条件对缓存进行清空,适用于删除;