spring boot JAP Ehcache

目的

ehcache 的使用

在spring boot jap 的repository 中加入缓存, 查询的时候会将我们查询的对象缓存到对应的key中,第二次查询的时候
如果sql命中了,那么jap不会发起查询,而是查询ehcach缓存中的数据

sql命中:  可以理解为相同的sql条件;

Ehcache 的注解:

@Cacheable : 将方法的返回值放入到缓存中, 检查缓存中是否存在key , 如果不存在那么将值加入缓存
@Cacheput : 将方法的返回值放入到缓存中, 不检查缓存中是否有对应的key
@CacheEvict: 清除key 对应的缓存
    value ehcache 名称
    key: 缓存的键值
    condition: 触发的条件
    allEntries: 布尔值 是否全部清除  

demo

java config 如下
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">

    <!--
    (1).diskStore: 为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:    
             user.home – 用户主目录
             user.dir  – 用户当前工作目录
             java.io.tmpdir – 默认临时文件路径

   (2).defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。

    (3).cache:自定缓存策略,为自定义的缓存策略。参数解释如下:
    cache元素的属性:
            name:缓存名称
            maxElementsInMemory:内存中最大缓存对象数
            maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大
            eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false
            overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,
            会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。
            diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。
            diskPersistent:是否缓存虚拟机重启期数据
            diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒
            timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,
            如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。
            只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态
            timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,
            如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。
            只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。
            timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义
            memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。
            可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)

    -->
    <diskStore path="java.io.tmpdir/Tmp_EhCache"/>
    <defaultCache eternal="false"
                  maxElementsInMemory="1000"
                  overflowToDisk="false"
                  diskPersistent="false"
                  timeToIdleSeconds="0"
                  timeToLiveSeconds="600"
                  memoryStoreEvictionPolicy="LRU"/>

    <cache name="demo"
           eternal="false"
           maxElementsInMemory="100"
           overflowToDisk="false"
           diskPersistent="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="300"
           memoryStoreEvictionPolicy="LRU"/>

    <cache name="users"
           eternal="false"
           maxElementsInMemory="100"
           overflowToDisk="false"
           diskPersistent="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="300"
           memoryStoreEvictionPolicy="LRU"/>

</ehcache>
@Configuration
@EnableCaching
public class EhcacheConfig {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean managerFactoryBean = new EhCacheManagerFactoryBean();
        managerFactoryBean.setConfigLocation(new ClassPathResource("config/ehcache.xml"));
        managerFactoryBean.setShared(true);
        return managerFactoryBean;
    }

    @Bean
    public EhCacheCacheManager ehCacheCacheManager() {
        return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
    }
}

@Repository
@CacheConfig(cacheNames = "users")
public interface UserNewRepository extends JpaRepository<UserNew, Long> {
    
    public UserNew findUserNewByName(String name);

    @Cacheable(key = "#id + 'findById'")
    public UserNew findUserNewById(Long id);


    @Modifying
    @Query(value = "update UserNew  u set u.name=:name, u.age=:age where u.id=:id")
    @CacheEvict(key = "#id + 'findById'")
    public void updateUser(@Param("age") int age, @Param("name") String name, @Param("id") Long id);

    @Override
    @CacheEvict(allEntries = true)
    public void deleteAllInBatch();

}

reference

 https://www.cnblogs.com/lic309/p/4072848.html
 
 根据博客自己实践, ehcache 缓存对查询确实有帮助~~