缓存技术

在项目中对于常用的查询数据库业务,对于数据改动几乎很少改动的数据,若频繁调用数据库去请求获取该数据会比较浪费数据库的资源,所以该数据可以放在缓存里,方便读取,常用的缓存技术Spring Cache技术和Spring Redis Data

Spring Cache技术

采用了AOP的技术,利用代理的模式进行在方法执行前的自动数据处理缓存,对业务侵入性小

Spring Redis Data技术

实现是由RedisTemplate提供方法进行数据存储

两种方法第一种适合存储string单类型的数据,第二种存储类型更加全面

Spring Cache技术提供了以下注解

@Cacheable:在方法执行前查看是否有缓存对应的数据,如果有直接返回数据,如果没有调用方法获取数据返回,并缓存起来。

@CacheEvict:将一条或多条数据从缓存中删除。

@CachePut:将方法的返回值放到缓存中

@Caching:组合多个缓存注解;

缓存流程

用户通过请求数据首先查询缓存是否存在缓存,若存在即返回数据

不存在查询数据库,如数据查询到即存入缓存方便下次读取

如数据不存在即返回空数据

首页原型设计

首页服务原型

业务分析:

首页服务列表:分为服务类别和服务项,显示两个服务类别即每个类别下显示四个服务项

要点避开:

因为涉及类的引用,尽可能避免查询数据库出现1+n现象

查询一级分类时,构建sql语句使用连表查询,也不可使用for-eache嵌套

1
2
3
4
5
6
7
8
9
10
11
//截止下标
int endindex = list.size()>2? 2: list.size();
List<ServeCategoryResDTO> serveCategoryResDTOS = new ArrayList<>(list.subList(0,endindex));
serveCategoryResDTOS.forEach(
item->{
List<ServeSimpleResDTO> serveResDTOList = item.getServeResDTOList();
int endindex1 = serveResDTOList.size()>4?4:serveResDTOList.size();
List<ServeSimpleResDTO> serveSimpleResDTOS = new ArrayList<>(serveResDTOList.subList(0,endindex1));
item.setServeResDTOList(serveSimpleResDTOS);
}
);

对于查询出的数据进行,下标截止以好应对小程序端的显示。

缓存实现

使用Spring Cache注解形式

unless属性的值是一个SpEL表达式,表示缓存不应该被执行的条件,若条件成立,则不会将执行结果放入缓存中。

1
2
3
4
5
6
@Caching(
cacheable = {
@Cacheable(value = RedisConstants.CacheName.SERVE_ICON, key = "#regionId", unless = "#result.size() != 0", cacheManager = RedisConstants.CacheManager.THIRTY_MINUTES),
@Cacheable(value = RedisConstants.CacheName.SERVE_ICON, key = "#regionId", unless = "#result.size() == 0", cacheManager = RedisConstants.CacheManager.FOREVER)
}
)

xxl-job定时任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@XxlJob(value = "activeRegionCacheSync")
public void activeRegionCacheSync(){

log.info(">>>>>>>>>>>>>>>>>>>>>开始缓存");
String key = RedisConstants.CacheName.JZ_CACHE+"::ACTIVE_REGIONS";
redisTemplate.delete(key);


List<RegionSimpleResDTO> regionSimpleResDTOS = regionService.queryActiveRegionList();
regionSimpleResDTOS.forEach(item->{
Long id = item.getId();
String hotkey = RedisConstants.CacheName.HOT_SERVE+"::"+id;
redisTemplate.delete(hotkey);
homeService.queryServeAggregationSimpleResDTOByRegionIdCache(id);
});

log.info("结束缓存>>>>>>>>>>>>>>>>>>>>>>>");
}