概述
这个工具类是基于Springboot的PageHelper依赖的
当我们使用Redis进行分页数据同步时,为了避免每次查询都调用数据库创建新的PageInfo对象,所以我们需要自行封装PageInfo的数据。
使用Redis进行分页数据库的数据同步
问题
为了方便数据的修改而不调用大量资源我们不能将所有数据直接封装进Redis中,因为当我们修改其中一条数据时,如果我们使用的是直接将数据写进Redsi中,那么我们只有将该表的所有数据删除然后重新写入数据,当我们数据量庞大时对Redis的压力与速度都是一种挑战
解决方案
这里我使用了Redis的list指向String的数据结构完成数据的存储,并且对分页进行了实现。
list存的是所有数据的地址,String中存的是实际数据,这样我们就可以通过list中的地址访问到实际数据,也可以直接修改我们想要修改的数据,而不是对所有数据进行修改
分页的问题
问题:因为我们实现了分页所以面临着一个新问题,就是我们分页取数据时和数据库取份分页数据一样我们是靠list中的下标取的,如果我们先访问的是第二页那么Redis的list中第一条数据就是第二页的第一条数据,那么当我们访问第一页的数据时,第一页的数据就会存存储在第二页数据之后,这时候数据就会发生错乱。
解决方案:我们可以先对list进行占位然后进行数据的填充,这样就解决这个问题了
代码
这里以对小区数据的同步为例
public class CommunityServiceImpl implements CommunityService{
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private CommunityMapper communityMapper;
//redis中所有小区主键
private static final String ALLCOMMUNITY = "AllCommunity";
//redis每个小区主键
private static final String COMMUNITY = "CommunityId:";
//分页大小
private static final int SIZE = 2;
//根据页码查询所有小区
@Override
public JsonResult findAllCommunity(int page) {
ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
ListOperations<String, String> opsForList = stringRedisTemplate.opsForList();
//当前页面第一个元素在数据库中的行号
int begin = SIZE * (page - 1);
//当前页面最后一个元素在数据库中的行号
int end = SIZE * page - 1;
//判断有没有存数据地址的表
boolean flag = stringRedisTemplate.hasKey(ALLCOMMUNITY);
//没有该list表则新建并进行占位
if (!flag) {
List list = list();
for