SpringBoot缓存 --(一)EhCache2.X

2020-02-24 16:03:19来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

SpringBoot缓存 --(一)EhCache2.X

简介:

  Spring 3.1中开始对缓存提供支持,核心思路是对方法的缓存,当开发者调用一个方法时,将方法的参数和返回值作为key/value缓存起来,当再次调用该方法时,如果缓存中有数据,就直接从缓存中获取,否则再去执行该方法。但是,Spring 中并未提供缓存的实现,而是提供了-套缓存API,开发者可以自由选择缓存的实现。

  目前Spring Boot支持的缓存有如下几种::  

  JCache (JSR-107)
  EhCache 2.x
  Hazelcast
  Infinispan
  Couchbase
  Redis
  Caffeine
  Simple

 

使用:

pom.xml

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

Encache配置文件:ehcache.xml

  这是一个常规的Ehcache 配置文件,提供了两个缓存策略,一个是默认的,另一个名为book _cache。

   其中,name表示缓存名称:

   maxElementsInMemory 表示缓存最大个数:

   etemal 表示缓存对象是否永久有效,一旦设置了永久有效,timcout 将不起作用:

   timeToldleSeconds 表示缓存对象在失效前的允许闲置时间(单位:秒),当etermal对象不是永久有效时,该属性才生效:

   timeToLiveSeconds表示缓存对象在失效前允许存活的时间(单位:秒),当eternal-false对象不是永久有效时,该属性才生效:

   overflowToDisk 表示当内存中的对象数量达到maxElementsInMemory时,Eheache 是否将对象写到磁盘中:

   diskxpiryTheadntervalseconds 表示磁盘失效线程运行时间间隔。

<ehcache>
    <diskStore path="java.io.tmpdir/cache"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
    />
    <cache name="book_cache"
           maxElementsInMemory="10000"
           eternal="true"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           overflowToDisk="true"
           diskPersistent="true"
           diskExpiryThreadIntervalSeconds="10"/>
</ehcache>

开启缓存:@EnableCaching注解

@SpringBootApplication
@EnableCaching
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }
}

创建实体类和service

public class Book implements Serializable {
    private Integer id;
    private String name;
    private String author;

。。。。。
}
@Service
@CacheConfig(cacheNames = "book_cache")
public class BookDao {
    @Autowired
    MyKeyGenerator myKeyGenerator;
@Cacheable(keyGenerator
= "myKeyGenerator") public Book getBookById(Integer id) { System.out.println("getBookById"); Book book = new Book(); book.setId(id); book.setName("三国演义"); book.setAuthor("罗贯中"); return book; } @CachePut(key = "#book.id") public Book updateBookById(Book book) { System.out.println("updateBookById"); book.setName("三国演义2"); return book; } @CacheEvict(key = "#id") public void deleteBookById(Integer id) { System.out.println("deleteBookById"); } }

  在Service层上添加@CacheConfig注解指明使用的缓存的名字,这个配置可选,若不使用@CacheConfig注解,则直接在@Cacheable注解中指明缓存名字。

  在getBookById方法上添加@Cacheable注解表示对该方法进行缓存,默认情况下,缓存的key是方法的参数,缓存的value是方法的返回值。当开发者在其他类中调用该方法时,首先会根据调用参数查看缓存中是否有相关数据,若有,则直接使用缓存数据,该方法不会执行,否则执行该方法,执行成功后将返回值缓存起来,但若是在当前类中调用该方法,则缓存不会生效

  @Cacheable注解中还有一个属性condition用来描述缓存的执行时机,例如@Cacheable(condition= "#id%2= =0")表示当id对2取模为0时才进行缓存,否则不缓存。

  如果开发者不想使用默认的key,也可以自定义key,key = "#book.id"表示缓存的key为参数book对象中id 的值,key = "#id"表示缓存的key为参数id.

  除了这种使用参数定义key的方式之外,Spring 还提供了一个root对象用来生成key,如表。

 

 

   @CachePut注解一般用于数据更新方法上,与@Cacheable 注解不同,添加了@CachePut注解的方法每次在执行时都不去检查缓存中是否有数据,而是直接执行方法,然后将方法的执行结果缓存起来,如果该key对应的数据已经被缓存起来了,就会覆盖之前的数据,这样可以避免再次加载数据时获取到脏数据。同时,@CachePut具有和@Cacheable类似的属性,这里不再赘述。

  @CacheEvict注解一般用于删除方法上,表示移除一个key对应的缓存。@CacheEvict注解有两个特殊的属性: allEntries和beforeInvocation, 其中allEntries表示是否将所有的缓存数据都移除,默认为false, beforeInvocation表示是否在方法执行之前移除缓存中的数据,默认为false,即在方法执行之后移除缓存中的数据。

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CacheApplicationTests {
    @Autowired
    BookDao bookDao;
    @Test
    public void contextLoads() {
        bookDao.getBookById(1);
        bookDao.getBookById(1);

        bookDao.deleteBookById(1);

        Book b3 = bookDao.getBookById(1);
        System.out.println("b3:"+b3);

        Book b = new Book();
        b.setName("三国演义");
        b.setAuthor("罗贯中");
        b.setId(1);
        bookDao.updateBookById(b);

        Book b4 = bookDao.getBookById(1);
        System.out.println("b4:"+b4);
    }
}

控制台:


getBookById
deleteBookById
getBookById
b3:Book{id=1, name='三国演义', author='罗贯中'} 
updateBookById b4:Book{id
=1, name='三国演义', author='罗贯中'}

 


原文链接:https://www.cnblogs.com/crazy-lc/p/12358138.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SpringCloud微服务:阿里开源组件Nacos,服务和配置管理

下一篇:手把手带你阅读Mybatis源码(三)缓存篇