kafka及redis基礎

liuchangxus發表於2020-09-27

初識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 和關係型資料庫比較優

相關文章