kafka及redis基础

初识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分)
 */

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
三 . Redis的持久化机制。

持久化流程

(1)客户端向服务端发送写操作(数据在客户端的内存中)。

(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。

(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。

(4)操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。

(5)磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

实际使用中 , 这个数据存储过程会发生主要两种故障 ,
即时保存了数据 , 保存的数据也可能已经损坏:

1)Redis数据库发生故障,
2)操作系统发生故障,

Redis如何保证上面5步保存动作 : 它提供了两种机制

RDB和AOF

1 . RDB机制

RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

2 . AOF机制

全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

每当有一个写命令过来时,就直接保存在我们的AOF文件中。

初识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分)

持久化流程

(1)客户端向服务端发送写操作(数据在客户端的内存中)。

(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。

(3)服务端调用write这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。

(4)操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。

(5)磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。

实际使用中 , 这个数据存储过程会发生主要两种故障 ,
即时保存了数据 , 保存的数据也可能已经损坏:

1)Redis数据库发生故障,
2)操作系统发生故障,

Redis如何保证上面5步保存动作 : 它提供了两种机制

RDB和AOF

1 . RDB机制

RDB其实就是把数据以快照的形式保存在磁盘上。什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

2 . AOF机制

全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。

每当有一个写命令过来时,就直接保存在我们的AOF文件中。

点赞

评论

分享

收藏

手机看

打赏

关注
一键三连

第9章 初识Redis Cluster.rar
04-25
一站式学习Redis 从入门到高可用分布式实践(九) 包含Redis基础,使用经验介绍、Java,Python客户端示范、Redis使用规范,由浅入深讲解并伴有企业中Redis开发的相关项目以及大规模
初识Redis——邂逅
始终不够
3474
最近由于一块业务系统瓶颈的原因,需要找一个能够实现数据快速汇总的工具做一个中间缓存。具体场景是这样的:服务器收集WEB机群的日志集中处理,日志中有大量重复信息,需要汇总做COUNT次数统计。最开始用的MYSQL,后来发现写入瓶颈,造成数据库写入线程阻塞,日志处理线程只能等到不然会把放在内存里的数据库写入队列塞满。后来按业务做了分表,数据库写入和日志处理都改成了多线程。仍然不能解决问题,服务器负载也

优质评论可以帮助作者获得更高权重
初识redis——mac下搭建redis环境
matt_zuo的博客
214
初识redis——mac下搭建redis环境 一、redis简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础
初识Redis及Redis在Windows下的安装和使用
weixin_33743880的博客
24
为什么80%的码农都做不了架构师?>>> …
初识redis_bisal的专栏-CSDN博客
9-11
我们的系统,即将使用redis作为分布式缓存,所以有必要脑补下这方面的知识,碰巧看到好友老杨公众号的一篇推文,短小而精湛,对了解什么是redis,还是非常有帮助,《涨知识…
初识Redis_布谷鸟-CSDN博客
9-14
(二)初识Redis 特点 ① 数据存储:数据保存在内存中,存取速度快,还能不定期持久化到硬盘中,保障数据的安全性 ② Value类型:支持存储的value类型相对memcached更多,包…
[Redis学习] 初识Redis
睁眼看世界
585
1.Redis特性   Redis是基于内存的Key-Value型高性能的NoSQL数据库。Redis之所以受到如此多公司的青睐,必然有之过人之处,下面关于Redis的8个重要特性。 1.1 速度快   正常情况下,Redis执行命令的速度非常快,下面我们分析一下Redis速度快的原因。可以大致归纳为一下四点: 1. Redis的所有数据都是存放在内存中的,所以把数据放在内存中是Red…
【redis实战】初识Redis
Angus的博客
48
安装redis mac:用Homebrew( Homebrew介绍和使用)安装很方便 ~ brew install redis brew install redis Updating Homebrew… ==> Auto-updated Homebrew! Updated 1 tap (homebrew/cask). ==> Downloading https://homebr…
初识Redis_甲方乙方-CSDN博客
9-18
初识RedisRedis是一个速度非常快的非关系数据库(non-relational database),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的…
redis学习1:初识redis_qq_37410328的博客-CSDN博客
5-19
redisRedis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。简而言之redis就是放在远程网络上的…
初识Redis集群(Redis Cluster)
weixin_44297716的博客
31
Redis Cluster(Redis集群) 一丶前言​ Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。​ Redis集群搭建的方式有多种,例如使…
初识redis-cluster
weixin_30855099的博客
23
安装redis 1 [root@localhost ~]# cd /datas/soft/ 2 [root@localhost soft]# ll redis-5.0.0.tar.gz // 已经下载的最新版 3 -rwxrwxrwx 1 www www 1947721 Oct 22 14:21 redis-5.0.0.tar.gz 4 [root@localhost …
初识redis_weixin_44697116的博客-CSDN博客
8-4
初识redisredis 是一款高性能的NOSQL类型的非关系型数据库NOSQL 和关系型数据库比较优

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页