Spring 中提供了很多存储器,例如: SimpleCacheManager , EhCacheCacheManager, GuavaCacheManager, CompositeCacheManger。处理核心的Spring框架之外,Spring Date 提供提供了Redis缓存管理器。RedisCacheManager。
Spring Boot 中通过 @EnableCaching
注解自动化配置合适的缓存管理器。
默认情况下Spring Boot 根据以下顺序自动检测缓存提供者:
- Generic
- JCache (JSR-107)
- EhCache 2.x
- Hazelcast
- Infinispan
- Redis
- Guava
- Simple
若我们手动配置RedisTemplate后,Spring Boot 就无法自动给RedisCacheManager设置redisTemplate,所以需要自己配置RedisCacheManager。
1 | RedisConfig.java |
Spring 提供了以下注解来声明缓存规则
@Cacheable triggers cache population 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值,,如果这个值能够找到,就会返回这个值。否则的话,这个方法就会被调用,返回值会放到缓存中
@CacheEvict triggers cache eviction 表明Spring应该在缓存中清除一个或多个条目
@CachePut updates the cache without interfering 表明Spring应该将方法的返回值放到缓存中,在方法的调用前并不会检查,方法始终都会被调用
@Caching regroups multiple cache operations to be applied on a method
@CacheConfig shares some common cache-related setting at class-level 可以在类层级配置一些公用的缓存配置
@Cacheable 和 @CachePut 共有属性:
属性 | 类型 | 描述 |
---|---|---|
value | String[] | 要使用的缓存名称 |
condition | String | SpEL 表达式,如果得到的值是false的话,不会将缓存应用到方法调用上 |
key | String | SpEL表达式,用来计算自定义的缓存key |
unless | String | SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中 |
使用 CacheManager 的有点:
CacheManager 是所有缓存管理器的父级,定义了一些通用接口。
具体的缓存实现可以继承CacheManger,并自行实现功能。通过这个方法可以进行拆分解耦,当替换其他缓存插件时,不需要修改代码,只需要修改配置文件就行。
Redis 在项目中的使用
- 开启Redis事务
@Transactional
与stringRedisTemplate.setEnableTransactionSupport(true);
需要同时启用。 - 查询不存在的数据,需要将一组空数据写入Redis,防止数据库被穿透。
- 查询数据时,需要使用 lock ,来防止所有请求都走数据库,而不走Redis,大流量,大并发的情况下。
Redis 集群
Redis 集群只有 db0,不支持 select db操作,不支持 Redis 事务操作。