6. 缓存
云环境中的缓存对于应用程序减少延迟和节省数据库往返非常有用。 减少数据库往返次数可以显著降低对数据库实例的要求。Spring 框架 从 3.1 版本开始,提供了一个统一的 Cache 抽象,允许在类似于 声明性事务。
Spring Cloud AWS 将 Amazon ElastiCache 服务集成到 Spring 统一的 Spring 中 缓存抽象提供基于 memcached 和 Redis 协议的缓存管理器。Spring 的缓存支持 云 AWS 为 ElastiCache 提供自己的 memcached 实现,并将 Spring Data Redis 用于 Redis 缓存。
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 的依赖项定义
<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 驱动程序并自动使用其中一个驱动程序。
6.2. 使用 XML 配置缓存
Spring Cloud AWS 的缓存支持驻留在 context 模块中,因此如果上下文模块 已导入到项目中。缓存集成提供了自己的命名空间来配置缓存集群,这些集群 托管在 Amazon ElastiCache 服务中。下一个示例包含缓存集群和 Spring 配置以启用基于注解的声明式缓存。
<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-manager
CacheCluster
6.2.1. 混合缓存
应用程序可能需要由一个中央缓存群集维护的多个缓存。The Spring Cloud AWS 缓存支持允许在一个缓存管理器中定义多个缓存,也可以使用外部定义的缓存 在缓存管理器中。
下面的示例演示了一个配置示例,该示例包含带有元素
(可能是本地缓存)和 ElastiCache 缓存集群的配置。cache-ref
cache-cluster
<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 服务。
该元素接受定义过期时间(以秒为单位)的 expiration 属性。
No configured values 表示存在无限的过期时间。cache-cluster
<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 来配置缓存。下一个示例显示了两个缓存集群的配置。Configuration
org.springframework.cloud.aws.cache.config.annotation.EnableElastiCache
@EnableElastiCache({@CacheClusterConfig(name = "firstCache"), @CacheClusterConfig(name = "secondCache")})
public class ApplicationConfiguration {
}
如果将属性留空,则 CloudFormation 堆栈中的所有缓存(如果可用)
将自动配置。value |
6.3.1. 配置 cache 的过期时间
Java 配置还允许配置缓存的到期时间。这可以对所有
缓存,如以下示例所示。defaultExpiration
@EnableElastiCache(defaultExpiration = 23)
public class ApplicationConfiguration {
}
可以使用 annotations expiration 属性在缓存级别定义过期时间,如下所示(使用秒作为
值)。@CacheClusterConfig
@EnableElastiCache({@CacheClusterConfig(name = "firstCache", expiration = 23), @CacheClusterConfig(name = "secondCache", expiration = 42)})
public class ApplicationConfiguration {
}
6.4. 在 Spring Boot 中配置缓存
缓存将在 Spring Boot 中自动配置,而无需任何显式的配置属性。
6.5. 使用缓存
根据缓存的配置,开发人员可以对其方法进行注释,以将缓存用于方法返回值。 下一个示例包含应为其缓存返回值的服务的缓存声明
@Service
public class ExpensiveService {
@Cacheable("CacheCluster")
public String calculateExpensiveValue(String key) {
...
}
}
6.6. Memcached 客户端实现
Java 有不同的 memcached 客户端实现,最突出的是 Spymemcached 和 XMemcached。 Amazon AWS 支持动态配置,并提供基于 Spymemcached 的增强型 memcached 客户端,以支持基于 中央配置终端节点。
Spring Cloud AWS 依赖于 Amazon ElastiCache Client 实现,因此依赖于它。
6.7. 使用 CloudFormation
Amazon ElastiCache 集群也可以在堆栈中配置,然后由应用程序使用。Spring Cloud AWS 还支持按逻辑名称查找堆栈配置的缓存集群,并将解析为物理 名字。以下示例显示了 CloudFormation 模板中的缓存集群配置。
"CacheCluster": {
"Type": "AWS::ElastiCache::CacheCluster",
"Properties": {
"AutoMinorVersionUpgrade": "true",
"Engine": "memcached",
"CacheNodeType": "cache.t2.micro",
"CacheSubnetGroupName" : "sample",
"NumCacheNodes": "1",
"VpcSecurityGroupIds": ["sample1"]
}
}
然后,可以将缓存群集与应用程序配置中的名称一起使用,如下所示:CacheCluster
<beans...>
<aws-cache:cache-manager>
<aws-cache:cache-cluster name="CacheCluster" expiration="15"/>
</aws-cache:cache-manager>
<beans>
通过上述配置,应用程序可以在不同的环境中部署多个堆栈 无需在应用程序内部进行任何配置更改。