6. 缓存

云环境中的缓存对于应用程序减少延迟和节省数据库往返非常有用。 减少数据库往返次数可以显著降低对数据库实例的要求。Spring 框架 从 3.1 版本开始,提供了一个统一的 Cache 抽象,允许在类似于 声明性事务。spring-doc.cn

Spring Cloud AWS 将 Amazon ElastiCache 服务集成到 Spring 统一的 Spring 中 缓存抽象提供基于 memcached 和 Redis 协议的缓存管理器。Spring 的缓存支持 云 AWS 为 ElastiCache 提供自己的 memcached 实现,并将 Spring Data Redis 用于 Redis 缓存。spring-doc.cn

6.1. 配置 Redis 缓存的依赖项

Spring Cloud AWS 提供了自己的 memcached 缓存实现,因此不需要其他依赖项。对于 Redis Spring Cloud AWS 依靠 Spring Data Redis 来支持缓存,并允许使用多个 Redis 驱动程序。Spring 云 AWS 使用 Jedis 支持 Spring Data Redis 支持的所有 Redis 驱动程序(目前为 Jedis、JRedis、SRP 和 Lettuce) 在内部用于针对 ElastiCache 进行测试。示例中显示了 Redis 与 Jedis 的依赖项定义spring-doc.cn

<dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>${spring-data-redis.version}</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.6.1</version>
    </dependency>
</dependencies>

Spring Cloud AWS 将自动检测 Redis 驱动程序并自动使用其中一个驱动程序。spring-doc.cn

6.2. 使用 XML 配置缓存

Spring Cloud AWS 的缓存支持驻留在 context 模块中,因此如果上下文模块 已导入到项目中。缓存集成提供了自己的命名空间来配置缓存集群,这些集群 托管在 Amazon ElastiCache 服务中。下一个示例包含缓存集群和 Spring 配置以启用基于注解的声明式缓存。spring-doc.cn

<beans xmlns:aws-cache="http://www.springframework.org/schema/cloud/aws/cache"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/cache
        http://www.springframework.org/schema/cloud/aws/cache/spring-cloud-aws-cache.xsd
        http://www.springframework.org/schema/cache
        https://www.springframework.org/schema/cache/spring-cache.xsd">

    <aws-context:context-credentials>
        ...
        </aws-context:context-credentials>

    <aws-cache:cache-manager>
        <aws-cache:cache-cluster name="CacheCluster" />
    </aws-cache:cache-manager>

    <cache:annotation-driven />
</beans>

上面的配置配置了 一个缓存,其名称代表 ElasticCache 集群cache-managerCacheClusterspring-doc.cn

6.2.1. 混合缓存

应用程序可能需要由一个中央缓存群集维护的多个缓存。The Spring Cloud AWS 缓存支持允许在一个缓存管理器中定义多个缓存,也可以使用外部定义的缓存 在缓存管理器中。spring-doc.cn

下面的示例演示了一个配置示例,该示例包含带有元素 (可能是本地缓存)和 ElastiCache 缓存集群的配置。cache-refcache-clusterspring-doc.cn

<beans ...>
    <aws-cache:cache-manager id="cacheManager">
        <aws-cache:cache-ref ref="memcached" />
        <aws-cache:cache-cluster name="SimpleCache"/>
    </aws-cache:cache-manager>
</beans>

6.2.2. 定义过期

Spring 缓存划分不支持过期时间配置,并将其留给缓存实现 以支持到期时间。Spring Cloud AWS 缓存配置支持每个缓存的到期时间设置。这 过期时间将传递给 Memcached 服务。spring-doc.cn

该元素接受定义过期时间(以秒为单位)的 expiration 属性。 No configured values 表示存在无限的过期时间。cache-clusterspring-doc.cn

<beans>
    <aws-cache:cache-manager>
        <aws-cache:cache-cluster expiration="10000" name="CacheCluster" />
    </aws-cache:cache-manager>
</beans>

6.3. 使用 Java 配置配置缓存

Spring Cloud AWS 还支持使用 Java 配置类进行缓存配置。在任何类上, 可以使用 Spring Cloud AWS 提供的 Comments 来配置缓存。下一个示例显示了两个缓存集群的配置。Configurationorg.springframework.cloud.aws.cache.config.annotation.EnableElastiCachespring-doc.cn

@EnableElastiCache({@CacheClusterConfig(name = "firstCache"), @CacheClusterConfig(name = "secondCache")})
public class ApplicationConfiguration {
}
如果将属性留空,则 CloudFormation 堆栈中的所有缓存(如果可用) 将自动配置。value

6.3.1. 配置 cache 的过期时间

Java 配置还允许配置缓存的到期时间。这可以对所有 缓存,如以下示例所示。defaultExpirationspring-doc.cn

@EnableElastiCache(defaultExpiration = 23)
public class ApplicationConfiguration {
}

可以使用 annotations expiration 属性在缓存级别定义过期时间,如下所示(使用秒作为 值)。@CacheClusterConfigspring-doc.cn

@EnableElastiCache({@CacheClusterConfig(name = "firstCache", expiration = 23), @CacheClusterConfig(name = "secondCache", expiration = 42)})
public class ApplicationConfiguration {
}

6.4. 在 Spring Boot 中配置缓存

缓存将在 Spring Boot 中自动配置,而无需任何显式的配置属性。spring-doc.cn

6.5. 使用缓存

根据缓存的配置,开发人员可以对其方法进行注释,以将缓存用于方法返回值。 下一个示例包含应为其缓存返回值的服务的缓存声明spring-doc.cn

@Service
public class ExpensiveService {

    @Cacheable("CacheCluster")
    public String calculateExpensiveValue(String key) {
        ...
    }
}

6.6. Memcached 客户端实现

Java 有不同的 memcached 客户端实现,最突出的是 SpymemcachedXMemcached。 Amazon AWS 支持动态配置,并提供基于 Spymemcached 的增强型 memcached 客户端,以支持基于 中央配置终端节点。spring-doc.cn

Spring Cloud AWS 依赖于 Amazon ElastiCache Client 实现,因此依赖于它。spring-doc.cn

6.7. 使用 CloudFormation

Amazon ElastiCache 集群也可以在堆栈中配置,然后由应用程序使用。Spring Cloud AWS 还支持按逻辑名称查找堆栈配置的缓存集群,并将解析为物理 名字。以下示例显示了 CloudFormation 模板中的缓存集群配置。spring-doc.cn

"CacheCluster": {
    "Type": "AWS::ElastiCache::CacheCluster",
    "Properties": {
        "AutoMinorVersionUpgrade": "true",
        "Engine": "memcached",
        "CacheNodeType": "cache.t2.micro",
        "CacheSubnetGroupName" : "sample",
        "NumCacheNodes": "1",
        "VpcSecurityGroupIds": ["sample1"]
    }
}

然后,可以将缓存群集与应用程序配置中的名称一起使用,如下所示:CacheClusterspring-doc.cn

<beans...>
    <aws-cache:cache-manager>
        <aws-cache:cache-cluster name="CacheCluster" expiration="15"/>
    </aws-cache:cache-manager>
<beans>

通过上述配置,应用程序可以在不同的环境中部署多个堆栈 无需在应用程序内部进行任何配置更改。spring-doc.cn