用Redis缓存Web网页的分页数据

  • 业务场景:把学生选课系统中学生群体数据放入缓存中,减少对数据库的访问,提高系统的负载能力。
  • 实现思路:1.在用户首次登陆选课系统时,会先判断Redis缓存中是否有该缓存(这里使用的是Redis的zset数据结构来实现)。
  • 补充:由于zset结构本身没有判断键是否存在的命令,我这里是用的是zcard(key)。zcard函数返回的是这个键对应的缓存集中的条数。

zset数据结构补充:

Redis中存放数据都是将数据串行化放入内存中,所以将对象串行化有两种方式:流串行和JSON

  1. zadd(key,score,members) 向key的键下面添加元素,排序方式默认是以score的字典升序,score是double类型的值,不能传错了。这里的key可以认为是指定 的一个有序Set,通过zset的操作可以自动更新有序Set的排序 zset数据结构
  2. zrem(key,members) 当匹配到key缓存中有相同的members(字符串)时,就删除对应的记录
  3. zrange(key,start,end) 获取索引区间的成员(按分数排序)
    1)[start,end]=[0,-1] -1比表示最后一个元素的索引
        zrange(key,0,-1)代表所有成员 
    2)end越界,显示从start开始到最后一个成员 
    3)start,end都越界,返回nil
  4. zcard(key) 获取key缓存中的所有元素的记录条数

  5. zscore(key,members) 获取对应members的score并返回,若不存在则返回null

  6. zcard(key) 获取key缓存中的所有元素的记录

 最后附上部分代码(有点糙,,)

页面初始化和分页:

/*
		 * 使用Redis有序SET进行缓存,可以进行排序
		 */
		total = (long) redis.zcard(key);
		if(total<=0){//如果元素个数《=0,表示key中没有缓存,从数据库中拿数据放入缓存》
			list = service.findAllStudent();
			redis.saveCache("student_rank", list);
			//page = service.selectAllByPage(searchParams.getSearchMap(),pageRequest);

		}
		int curruntindex=pageRequest.getPageNumber() * pageRequest.getPageSize();//分页开始索引
		int endindex=curruntindex+pageRequest.getPageSize()-1;//分页结束索引
		if(endindex>total){
			endindex=total.intValue();
		}
		//total = (long) redis.zcard(key);
		sublist=redis.getPageCache(key,curruntindex,endindex);
		page = service.findAllByPageRedis( searchParams.getSearchMap(), pageRequest, sublist,total);//返回页面Bean

对缓存更新数据:

            /*
    		 * 对缓存更新操作
    		 * 先删除匹配对的缓存中的数据,在新增数据
    		 */
    		List<Student> student=findByStudentno(entity.getStudentno());
    		member=gson.toJson(student.get(0));
    		if (redis.zscore(key, member)!=null) {//缓存中若没有member则返回null,否则返回                
                redis.zrem(key, member);         //member对应的Double对象
			}
    		member=gson.toJson(entity);
    		redis.zadd(key, Long.valueOf(entity.getStudentno()), member);

现就到这了,后续再有想法再来更新

猜你喜欢

转载自blog.csdn.net/Guitarf/article/details/81745873