您的位置:首页 > 健康 > 养生 > 使用redis做分页,性能提升将大大提升,亲测可用。

使用redis做分页,性能提升将大大提升,亲测可用。

2024/10/6 0:30:59 来源:https://blog.csdn.net/qq_39126115/article/details/141217684  浏览:    关键词:使用redis做分页,性能提升将大大提升,亲测可用。

    在日常工作中,分页数据被访问较为频繁,即使数据量并不是很大,但也较大数据库的开销,而且数据库支持的并发数并不是很多。再加分页查询通常在select和from之间带了不少子查询,遍历查找子查询过程中也会拖慢整体的数据查询。基于此,本文介绍一种基于redis缓存的分页,避免数据库查出过多的字段造成的性能下降。

    算法的基本步骤可分为:
     1.查数据库中的数据,仅仅查主键ID和用到排序的字段
     2.根据主键ID作为缓存的key,并到缓存中获取完整的实体。
     3.如果取值为空就在就到数据库中查找,找以后存到缓存中,以便下次查询时命中缓存。
     4.为了保持缓存中的数据和数据库中的数据一致,在数据更新时,对缓存数据进行“双删延迟”

代码展示:

	        //只查id和用来排序的字段,保持查找正确page = hteLibMediaMapper.selectHteLibMedia(page,hteLibMediaParam,qw);List<HteLibMediaVo> selectList = page.getRecords();List<Long> notCachList = new LinkedList<>();selectList.forEach(it -> {String mapKey = RedisKeyConsts.MEDIA_KEY + it.getId();HteLibMediaVo hteLibMediaVo = (HteLibMediaVo) redisTemplate.opsForValue().get(mapKey);//命中缓存if (hteLibMediaVo != null){BeanUtils.copyProperties(hteLibMediaVo , it);}else {notCachList.add(it.getId());}});//没有在缓存里素材库if (CollectionUtils.isNotEmpty(notCachList)){List<HteLibMediaVo> hteLibMediaVos = hteLibMediaMapper.selectMediaByIds(notCachList , hteLibMediaParam.getQueryUserId());Map<String , HteLibMediaVo> mediaVoHashMap = new HashMap<>();hteLibMediaVos.forEach(it -> {String key = RedisKeyConsts.MEDIA_KEY + it.getId();mediaVoHashMap.put(key , it);});//批量缓存this.batchWitrWithTTL(mediaVoHashMap , 7);selectList.forEach(it -> {String mapKey = RedisKeyConsts.MEDIA_KEY + it.getId();if (mediaVoHashMap.get(mapKey) != null){BeanUtils.copyProperties(mediaVoHashMap.get(mapKey) , it);}});}

    数据更新时“延迟双删”

//保持数据同步,延迟双删。HteLibMediaVo hteLibMediaVo = (HteLibMediaVo) redisTemplate.opsForValue().get(mediaKey);if (hteLibMediaVo != null){redisTemplate.delete(mediaKey);}this.updateById(mediaInfo);if (hteLibMediaVo != null){try {Thread.sleep(500);}catch (Exception e){e.printStackTrace();}redisTemplate.delete(mediaKey);}

     以上算法仅仅提供参考,具体的优化还要应系统而已。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com