初识Redis
一. 为什么在多线程并发情况下,以Redis实现的“自增ID工具”能保证ID按顺序自增长且不重复:
此处的自增ID工具用的是redis的增加score方法 , 每调用一次 , redis的key ‘id’ 就自增1 , 返回值为增加后的数值 , 故获取id的动作不会有重复值.
/**
* “自增ID工具”
* @description:
* @author: Jeff
* @date: 2020年9月21日
* @return
*/
public Long getId(){
return redisTemplate.opsForValue().increment("id", 1);
}
1
2
3
4
5
6
7
8
9
10
11
二 . 描述Redis之List类型分页实现过程,企业里存在类似的场景。
从redis中rang数据时 , 用的是按索引rang , 页面请求的页码和pageSize传到后台 , 调用redis的rang方法 ,
int startIndex = (pageNum-1)pageSize;作为起始索引 ,
int endIndex = pageNumpageSize;作为截至索引 , 就能获取到指定索引区间的数据返回页面 .
package com.chencan.redis.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.chencan.redis.domain.ScoreType;
import com.chencan.redis.domain.Student;
@Controller
public class StudentController {
@Resource
private RedisTemplate redisTemplate;
/**
* 6.页面数据展示:(25分)
(1)按原型图效果展示数据。(5分)
(2)正确显示“课程数”,课程数是学生除了成绩为“-”外课程的数量。(4分)
(3)正确显示“不及格数”,不及格数是除了成绩为“-”外,低于60分的课程数量。(5分)
(4)正确显示“平均成绩”,平均成绩是学生除了成绩为“-”外课程成绩的平均数。(5分)
(5)正确分页,每页展示10条。提示:必须在Redis中分好页,不得全部取出通过Java在虚拟机内存中分页。(6分)
* @description:
* @author: Jeff
* @date: 2020年9月21日
* @param pageNum
* @param pageSize
* @param model
* @return
*/
@RequestMapping("list")
public String list(@RequestParam(defaultValue="1")Integer pageNum,@RequestParam(defaultValue="9")Integer pageSize,Model model){
ListOperations<String, Student> opsForList = redisTemplate.opsForList();
int startIndex = (pageNum-1)*pageSize;
int endIndex = pageNum*pageSize;
List<Student> list = opsForList.range("studentList", startIndex, endIndex);
for (Student student : list) {
Float chinese = student.getChinese();
Float english = student.getEnglish();
Float maths = student.getMaths();
Float c = student.getC();
Float css = student.getCss();
Float cf = student.getCf();
Float ds = student.getDs();
Float dsi = student.getDsi();
ScoreType os= student.getOs();
Float network = student.getNetwork();
int classCount=0;
//String osname=os.getDiplayName();
int fcount=0;
int count =0;
//System.out.println(osname);
if(chinese==null){
}else{
classCount++;
count+=chinese;
if(chinese<60){
fcount++;
}
}
if(english==null){
}else{
classCount++;
count+=english;
if(english<60){
fcount++;
}
}
//数学
if(maths==null){
}else{
classCount++;
count+=maths;
if(maths<60){
fcount++;
}
}
if(c==null){
}else{
classCount++;
count+=c;
if(c<60){
fcount++;
}
}
if(css==null){
}else{
classCount++;
count+=css;
if(css<60){
fcount++;
}
}
if(cf==null){
}else{
classCount++;
count+=cf;
if(cf<60){
fcount++;
}
}
if(ds==null){
}else{
classCount++;
count+=ds;
if(ds<60){
fcount++;
}
}
if(dsi==null){
}else{
classCount++;
count+=dsi;
if(dsi<60){
fcount++;
}
}
if(network==null){
}else{
classCount++;
count+=network;
if(network<60){
fcount++;
}
}
student.setAvg(count/classCount);
student.setClassCount(classCount);
student.setFcount(fcount);
}
model.addAttribute("list", list);
model.addAttribute("pageNum", pageNum);
model.addAttribute("total", opsForList.size("studentList")/pageSize);
return "list";
}
/**
* 7.测试持久化机制:(10分)
(1)保持Web项目不停止运行的情况下,通过Redis客户端命令关闭Redis服务端。(3分)
(2)重新启动Redis服务端。(2分)
(3)刷新或继续访问页面,数据继续显示。数据丢失则全扣此大项13分。(5分)