# 缓存
合理的使用缓存技术,可减轻数据库压力,增大并发流量。
当前架构规定采用的缓存技术为Redis
,可天然支持分布式和集群环境。
# 命名规范
key值的命名规范,不同单词间通常使用英文冒号:
进行分割。
如enterprise:{enterpriseId}
,实际生成enterprise:abcdefg
。
禁止使用连续两个冒号,因为这是缓存注解的默认分割符。
# 使用方式
目前主要有以下两种实现方式。
- Redis API方式
常见场景:存储短信验证码,二次查询等临时性信息。
原生API:
@Autowired
private RedisTemplate redisTemplate;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
2
3
4
5
对于一些经常使用的set
,get
等redis方法,已经将其封装成一个Service
接口。
@Autowired
private RedisService redisService;
redisService.set("key","value");
2
3
4
- 注解方式
常见场景:缓存标准库表,缓存不常变动的业务表数据。
注意:注解缓存如果需要采用redis技术,需要显示指定
spring.cache.type=redis
。
@Cacheable
生成缓存,进入方法前先预检是否有该缓存。
@CachePut
生成缓存,每次都进入方法。
@CacheEvict
删除缓存
常见用法,更多用法请自行度娘
/**
* 删除缓存
*/
@Override
@Caching(evict = {
@CacheEvict(value ="standardFixtureType",allEntries = true),
@CacheEvict(value ="standardFixtureType:list",allEntries = true),
@CacheEvict(value ="standardFixtureType:page",allEntries = true)
})
public void delete(List<String> ids) {}
/**
* 添加列表缓存
*/
@Override
@Cacheable(value = "standardFixtureType:list")
public List<StandardFixtureTypeModelExtend> get(StandardFixtureTypeModelSearch search, Sort sort) {}
/**
* 添加单条记录的缓存
*/
@Override
@Cacheable(value = "standardFixtureType",key = "#id")
public StandardFixtureTypeModelExtend get(String id) {}
/**
* 添加翻页缓存
* 注意:翻页缓存通常我们只缓存第一页
*/
@Override
@Cacheable(value ="standardFixtureType:page", condition = "#pageable.pageNumber==1")
public PageOb<StandardFixtureTypeModelExtend> get(StandardFixtureTypeModelSearch search, Pageable pageable) {}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
注意
像如下service接口中,自动生成的key值策略,暂不支持继承的属性
@Override
@Caching(evict = {
@CacheEvict(value ="standardFixtureType",allEntries = true)
})
public PageOb<StandardFixtureTypeModelExtend> get(StandardFixtureTypeModelSearch search, Pageable pageable) {}
2
3
4
5
两种生成的key值参考如下,可以看到同样的请求,如果字段被定义在了父类,是不会自动序列化到缓存的key键中的:
name
属性定义在StandardFixtureTypeModelSearch
的父类中,生成的key值=standardFixtureType:list::SimpleKey [StandardFixtureTypeModelSearch(),createTime: DESC]
name
属性定义在StandardFixtureTypeModelSearch
中,生成的key值=standardFixtureType:list::SimpleKey [StandardFixtureTypeModelSearch(name=JJ),createTime: DESC]