- 业务场景:把学生选课系统中学生群体数据放入缓存中,减少对数据库的访问,提高系统的负载能力。
- 实现思路:1.在用户首次登陆选课系统时,会先判断Redis缓存中是否有该缓存(这里使用的是Redis的zset数据结构来实现)。
- 补充:由于zset结构本身没有判断键是否存在的命令,我这里是用的是zcard(key)。zcard函数返回的是这个键对应的缓存集中的条数。
zset数据结构补充:
Redis中存放数据都是将数据串行化放入内存中,所以将对象串行化有两种方式:流串行和JSON
- zadd(key,score,members) 向key的键下面添加元素,排序方式默认是以score的字典升序,score是double类型的值,不能传错了。这里的key可以认为是指定 的一个有序Set,通过zset的操作可以自动更新有序Set的排序
- zrem(key,members) 当匹配到key缓存中有相同的members(字符串)时,就删除对应的记录
- zrange(key,start,end) 获取索引区间的成员(按分数排序)
1)[start,end]=[0,-1] -1比表示最后一个元素的索引 zrange(key,0,-1)代表所有成员 2)end越界,显示从start开始到最后一个成员 3)start,end都越界,返回nil
zcard(key) 获取key缓存中的所有元素的记录条数
zscore(key,members) 获取对应members的score并返回,若不存在则返回null
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);
现就到这了,后续再有想法再来更新