# 缓存

合理的使用缓存技术,可减轻数据库压力,增大并发流量。

当前架构规定采用的缓存技术为Redis,可天然支持分布式和集群环境。

# 命名规范

key值的命名规范,不同单词间通常使用英文冒号:进行分割。

enterprise:{enterpriseId},实际生成enterprise:abcdefg

禁止使用连续两个冒号,因为这是缓存注解的默认分割符。

# 使用方式

目前主要有以下两种实现方式。

  1. Redis API方式

常见场景:存储短信验证码,二次查询等临时性信息。

原生API:

@Autowired
private RedisTemplate redisTemplate;

ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
1
2
3
4
5

对于一些经常使用的set,get等redis方法,已经将其封装成一个Service接口。

@Autowired
private RedisService redisService;

redisService.set("key","value");
1
2
3
4
  1. 注解方式

常见场景:缓存标准库表,缓存不常变动的业务表数据。

注意:注解缓存如果需要采用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) {}
1
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) {}
1
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]

最后一次更新: 2021-6-2 16:28:35