`
234390216
  • 浏览: 10237962 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462838
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775925
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398693
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395137
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680150
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531113
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1184887
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468695
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151478
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68321
社区版块
存档分类
最新评论

Spring Boot(11)——使用Spring Cache

阅读更多

使用Spring Cache

Spring提供了Cache抽象,它允许我们声明哪些bean的哪些方法的外部调用需要使用Cache。方法调用使用了Cache后,在调用真实方法前会先从缓存中获取结果,缓存中如果没有则会调用真实方法,这也是基于AOP实现的。关于Spring Cache的介绍不是本文的重点,如有需要可以参考笔者写的http://elim.iteye.com/blog/2123030

在Spring Boot应用中使用Spring Cache需要在@SpringBootConfiguration标注的Class上添加@EnableCaching,这样就启用了Spring Cache。Spring Boot将根据Classpath下提供的Spring Cache实现类选择合适的实现者进行自动配置,支持的实现有基于Ehcache的实现、基于Redis的实现等,详情可参考org.springframework.boot.autoconfigure.cache.CacheConfiguration的源码。如果没有找到,则会使用基于ConcurrentMap的实现。

下面的代码中就启用了Spring Cache。

@SpringBootApplication
@EnableCaching
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.setAddCommandLineProperties(false);
        app.run(args);
    }

}

然后就可以在bean中使用Spring Cache提供的注解进行缓存的定义了,下面的代码中就定义了getTime()将使用名称为cacheName1的缓存。

@Component
public class SimpleService {

    @Cacheable("cacheName1")
    public long getTime() {
        return System.currentTimeMillis();
    }
    
}

简单的验证缓存生效的单元测试如下。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class CacheTest {

    @Autowired
    private SimpleService simpleService;
    
    @Test
    public void testGetTime() throws Exception {
        long time1 = this.simpleService.getTime();
        TimeUnit.MILLISECONDS.sleep(100);
        long time2 = this.simpleService.getTime();
        Assert.assertEquals(time1, time2);
    }
    
    
}

使用Ehcache实现

需要使用Spring Cache的Ehcache实现,首先需要在pom.xml中加入如下依赖。

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

然后最简单的方式是在Classpath的根路径下放一个ehcache.xml文件,这样Spring Boot默认就会启用Spring Cache的Ehcache实现了。Ehcache的自动配置由EhCacheCacheConfiguration定义。如果Ehcache的配置文件不是存放在Classpath根路径,则可以通过spring.cache.ehcache.config来指定,比如下面的代码指定了在Classpath下的config目录下寻找ehcache.xml文件作为Ehcache的配置文件。

spring.cache.ehcache.config=classpath:/config/ehcache.xml

Spring Cache的自动配置的属性定义类是CacheProperties,参考其API文档或源码可以查看选择的Spring Cache的实现可以指定的详细的配置信息。

SimpleService的getTime()指定了使用的Cache是名称为cacheName1的Cache。所以在ehcache.xml中需要定义一个名为cacheName1的Cache,配置如下:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    maxBytesLocalHeap="100M">
    <defaultCache maxElementsInMemory="10000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120"
        maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap" />
    </defaultCache>

    <cache name="cacheName1" />

</ehcache>

如果应用中应用了很多不同名称的Cache,如果都把它们在ehcache.xml中定义一次,可能你会觉得太麻烦。可能你想把一些主要的Cache在ehcache.xml中定义,进行充分的自定义配置。然后其它的则能够在使用的时候自动创建,并使用默认的默认的缓存配置,则可以定义自己的EhCacheCacheManager实现bean,实现getMissingCache()的逻辑为不存在则创建。这样Spring Boot将不再自动创建EhCacheCacheManager bean。下面的代码是一个简单的示例。

@Component
public class MyEhCacheCacheManager extends EhCacheCacheManager {

    @Override
    protected Cache getMissingCache(String name) {
        Cache cache = super.getMissingCache(name);
        if (cache == null) {
            Ehcache ehcache = super.getCacheManager().addCacheIfAbsent(name);
            cache = new EhCacheCache(ehcache);
        }
        return cache;
    }

}

使用Redis实现

需要使用Redis实现需要在pom.xml中添加spring-boot-starter-data-redis依赖,这样Spring Boot将自动创建RedisTemplate bean,有了RedisTemplate bean后Spring Boot将自动创建基于Redis实现的Spring Cache的CacheManager,RedisCacheManager。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Boot默认创建的RedisTemplate将使用localhost作为服务地址,端口号是6379,数据库索引为0,可以通过spring.redis.host指定Redis服务IP,spring.redis.port指定Redis服务监听端口号,spring.redis.database指定需要使用的数据库索引号。下面的代码中就指定了使用的是10.10.10.3这台主机上的Redis,数据库索引号是1。关于Redis的更多配置信息可以参考org.springframework.boot.autoconfigure.data.redis.RedisProperties的API文档。

spring.redis.host=10.10.10.3
spring.redis.database=1

默认Spring Cache的Redis实现存入Redis中的Key是cacheName::cacheKey的形式,其中cacheName是当前Spring Cache的name,cacheKey是Spring Cache传递过来的Key。可以通过spring.cache.redis.key-prefix指定存入Redis中的Key的前缀,当指定了该属性时,生成的Key将是该前缀加上Spring Cache传递过来的Key。比如下面的代码中指定了前缀是test-spring-cache::,如果Spring Cache传递的Key是key1,则最终存入Redis中的Key将是test-spring-cache::key1

spring.cache.redis.key-prefix=test-spring-cache::

可以通过spring.cache.redis.timeToLive指定Redis缓存的Key的存活时间。下面的代码中就指定了缓存的有效时间是60秒。

spring.cache.redis.timeToLive=60s

关于Spring Cache的Redis实现的更多配置可以参考org.springframework.boot.autoconfigure.cache.CacheProperties.Redis的API文档。

指定Cache实现

当Classpath下同时存放了多个Spring Cache的实现类,并且同时有多个Spring Cache实现类可以满足启用条件时,Spring Boot将按照一定的顺序进行选择,一旦应用了某个类型的Spring Cache实现后,其它类型的Spring Cache实现将是非启用的,因为这些自动启用的前提都要求当前环境中尚未有Spring Cache的CacheManager类型的bean。自动启用的顺序是按照org.springframework.boot.autoconfigure.cache.CacheType这个枚举中定义的顺序来的,它的定义如下。

    /**
     * Generic caching using 'Cache' beans from the context.
     */
    GENERIC,

    /**
     * JCache (JSR-107) backed caching.
     */
    JCACHE,

    /**
     * EhCache backed caching.
     */
    EHCACHE,

    /**
     * Hazelcast backed caching.
     */
    HAZELCAST,

    /**
     * Infinispan backed caching.
     */
    INFINISPAN,

    /**
     * Couchbase backed caching.
     */
    COUCHBASE,

    /**
     * Redis backed caching.
     */
    REDIS,

    /**
     * Caffeine backed caching.
     */
    CAFFEINE,

    /**
     * Simple in-memory caching.
     */
    SIMPLE,

    /**
     * No caching.
     */
    NONE

所以一旦Classpath下同时拥有Ehcache和Redis的Spring Cache实现时,将优先使用Ehcache的实现,如果想使用Redis的实现,可以通过spring.cache.type=redis指定使用Redis的实现。

指定Cache实现仅针对于自动配置生效,如果是自己定义了CacheManager实现,则该配置无效。

CacheManagerCustomizer

CacheManagerCustomizer是用来对CacheManager进行自定义扩展的,其定义如下:

@FunctionalInterface
public interface CacheManagerCustomizer<T extends CacheManager> {

    /**
     * Customize the cache manager.
     * @param cacheManager the {@code CacheManager} to customize
     */
    void customize(T cacheManager);

}

当需要对某个CacheManager实现进行一些自定义时,可以实现CacheManagerCustomizer接口,指定泛型为需要进行自定义的CacheManager实现类,然后把它定义为一个Spring bean。下面的代码就对Ehcache实现的CacheManager进行了一些自定义,其在EhCacheCacheManager初始化后采用默认的Cache配置创建了一些Cache。

@Component
public class EhcacheCacheManagerCustomizer implements CacheManagerCustomizer<EhCacheCacheManager> {

    @Override
    public void customize(EhCacheCacheManager cacheManager) {
        List<String> cacheNames = Arrays.asList("cacheName1", "cacheName2", "cacheName3", "cacheName4", "cacheName5", "cacheName6");
        cacheNames.forEach(cacheManager.getCacheManager()::addCacheIfAbsent);
    }

}

关于Spring Cache的自动配置可以参考org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration的源码或API文档。

(注:本文是基于Spring Boot 2.0.3所写)

0
0
分享到:
评论

相关推荐

    spring-boot——web笔记

    在这个主题下,我们将探讨 Spring Boot 如何处理静态资源、Thymeleaf 模板引擎的使用,以及如何自定义视图解析器。 1. **处理静态资源**: Spring Boot 默认会自动处理静态资源,主要查找路径在 `src/main/...

    从零开始学Spring Boot

    1.39 Spring Boot Cache理论篇 1.40 Spring Boot集成EHCache实现缓存机制 1.41 Spring Boot分布式Session状态保存Redis 1.42 Spring Boot Shiro权限管理 1.43 Spring Boot Shiro权限管理 1.44 Spring Boot Shiro权限...

    spring Boot 2 精髓

    本书系统介绍了Spring Boot 2的主要技术,侧重于两个方面,一方面是极速开发一个Web应用系统,详细介绍Spring Boot框架、Spring MVC、视图技术...使用Spring Session实现系统水平扩展,使用Spring Cache提高系统性能。

    Spring Boot 学习笔记完整教程.pdf

    - **Spring Cache**:Spring 框架中的缓存抽象,Spring Boot 提供了自动配置的支持。 - **集成 EHCache**:EHCache 是一个广泛使用的开源缓存,Spring Boot 可以集成 EHCache。 #### 5. 分布式 Session 共享 Spring...

    spring-boot-cache.rar

    在这个名为 "spring-boot-cache.rar" 的压缩包中,我们很可能是找到了一个基于 Spring Boot 的小型项目,它展示了如何在 Spring Boot 应用中集成和使用缓存功能。下面我们将详细探讨 Spring Boot 缓存的相关知识点。...

    Spring Boot 2精髓带书签目录高清版

    包括使用Spring实现RESTful架构,在Spring Boot框架下使用Redis、MongoDB、ZooKeeper、Elasticsearch等流行技术,使用Spring Session实现系统水平扩展,使用Spring Cache提高系统性能。 2.面对系统模块增加,性能和...

    spring boot 所有‘demo,打包下载’

    这个“spring boot 所有‘demo,打包下载’”的资源集合是一个极好的学习材料,涵盖了 Spring Boot 的多个关键领域,包括 JPA、Tomcat、Cache、Ant、Hibernate 4、Jetty、WAR 包、Web 开发和 XML 配置。 1. **...

    spring boot+Vue全栈开发实战

    6. **Chapter 12**: 可能讲解了Spring Boot的缓存管理,如何使用Spring Cache抽象来实现本地缓存(如EhCache)或分布式缓存(如Redis)。 7. **Chapter 14**: 可能是关于Spring Boot的微服务架构,如何使用Spring ...

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...

    spring cloud和spring boot两个完整项目

    核心技术采用Eureka、Fegin、Ribbon、Zuul、Hystrix、Security、OAth、Mybatis、Ace-cache等主要框架和中间件,UI采用Bootstrap、jquery等前端组件 spring boot项目是使用spring boot + thymeleaf 开发个人博客项目

    spring boot+spring cache实现两级缓存(redis+caffeine)

    "Spring Boot+Spring Cache实现两级缓存(Redis+Caffeine)" 知识点一:缓存与两级缓存 缓存是将数据从读取较慢的介质上读取出来放到读取较快的介质上,如磁盘--&gt;内存。平时我们会将数据存储到磁盘上,如:数据库。...

    Spring boot视频

    - **缓存策略**:使用 Spring Cache 或 Ehcache 等技术提高数据访问效率。 - **异步处理**:使用 `@Async` 实现异步任务处理,提高系统响应速度。 - **日志管理**:合理配置日志级别和日志框架(如 Logback),便于...

    autoload-cache-spring-boot-starter:自动加载缓存spring boot starter

    7. **使用方法**: 使用`autoload-cache-spring-boot-starter`通常涉及以下步骤: - 在`pom.xml`或`build.gradle`中添加依赖。 - 配置Spring Boot的application.properties或application.yml,设定缓存的相关参数。...

    Spring Boot 学习笔记完整教程.docx

    这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - **基础入门**:了解 Spring Boot 的核心理念,包括自动配置、起步依赖和独立运行的特性。 - **...

    spring boot 实践学习案例,与其它组件整合

    - Spring Boot 缓存,包括redis、ehcache、spring-cache、memcached、使用redis实现session共享 等。 - springboot-templates - Spring Boot 模板,包括thymeleaf、freemarker、jsp、表单校验 等。 - ...

    09. Spring Boot缓存技术

    在`application.properties`或`application.yml`中,可以通过`spring.cache.type`指定使用哪种缓存实现。例如,如果选择EhCache,配置如下: ```properties spring.cache.type=ehcache ``` 然后,我们需要引入对应的...

    spring boot+shiro 权限认证管理案例

    Spring Boot 和 Apache Shiro 的整合是企业级应用中常见的权限认证和安全管理方案。Spring Boot 提供了简化 Java 应用程序开发的框架,而 Shiro 是一个轻量级的安全框架,专注于身份验证、授权、会话管理和加密。...

    spring-boot-redis-annotation-demo:spring boot —— redis 缓存注解使用示例项目

    spring boot —— redis 缓存注解使用教程 示例项目地址: 依赖 在pom文件添加如下依赖 &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-data-redis 配置 在application.yml配置文件添加...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

Global site tag (gtag.js) - Google Analytics