缓存技术
在项目中对于常用的查询数据库业务,对于数据改动几乎很少改动的数据,若频繁调用数据库去请求获取该数据会比较浪费数据库的资源,所以该数据可以放在缓存里,方便读取,常用的缓存技术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("结束缓存>>>>>>>>>>>>>>>>>>>>>>>"); }
|