關於Redis的一些小問題

qq_48746631發表於2020-09-27

剛剛學習了Redis,有一些小問題在這裡總結記錄一下,加深一下記憶。

a)為什麼在多執行緒併發情況下,以Redis實現的“自增ID工具”能保證ID按順序自增長且不重複?
Redis自增ID工具**
public static Integer getId(RedisTemplate redisTemplate) {

	ValueOperations<String, Integer> opsForValue = redisTemplate.opsForValue();
	
	Integer intid = opsForValue.get("id");
	
	//自增
	long id = opsForValue.increment("id", 1);
	return (int)id;
	
}   
多執行緒併發,使用執行緒同步 可以保證ID按順序自增長且不重複

b)描述Redis之List型別分頁實現過程,以及假想企業裡存在類似的場景
首先將資料存入Redis

List<Goods> list=new ArrayList<>();
list.add(goods);
ListOperations<String, Goods> opsForList = redisTemplate.opsForList();
opsForList.leftPushAll("goods_list", list);

Controller層
@RequestMapping("list")
public String list(Model model,@RequestParam(defaultValue = "1")Integer pageNum,@RequestParam(defaultValue = "10")Integer pageSize){
	ListOperations<String,Goods> opsForList = redisTemplate.opsForList();
	
	int start=(pageNum-1)*pageSize;
	int end=pageNum*pageSize-1;
	List<Goods> list = opsForList.range("goods_list", start, end);
	model.addAttribute("list", list);
	model.addAttribute("pageNum", pageNum);
	model.addAttribute("total", (int)Math.ceil(opsForList.size("goods_list")/(pageSize*1.0)));
	
	return "list";

JSP頁面分頁






當前頁: p a g e N u m / {pageNum}/ pageNum/{total}

</div>

c)說下Redis的持久化機制。**
Redis是記憶體資料庫。他將自己的資料庫儲存狀態儲存在記憶體中,如果不想方法把資料庫狀態儲存到磁碟中,一旦服務程式退出,伺服器中的資料庫狀態也將消失不見。
​ 因此,redis提供了RDB和AOF持久化功能,這個功能將redis記憶體中的資料庫狀態儲存到磁碟中,避免資料意外丟失。
其中RDB為預設持久化方式,RDB持久化功能產生一個RDB檔案(經過壓縮的二進位制檔案)可還原成資料庫狀態。

儲存在硬碟裡,存在即可還原。

RDB檔案的建立通過兩個redis命令用於生成RDB檔案:SAVE ,BGSAVE。

Save命令:會阻塞redis服務程式,直到RDB檔案建立完成。伺服器阻塞期間,伺服器不能處理任何命令請求。
BGSAVE命令會派生一個子程式,然後由子程式負責建立RDB檔案,服務父程式繼續處理命令。
另外,當我們執行shutdown命令的時候,redis在關閉的時候,也會執行save

RDB持久化是通過儲存資料庫中的鍵值對來記錄資料的狀態不同,而AOF持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。
AOF持久化的方法是將伺服器執行的set ,sadd,rpush三個命令儲存到AOF檔案中

而,RDB持久化是將msg,fruits,numbers三個鍵的鍵值對儲存到RDB檔案。

AOF載入:

伺服器啟動時通過載入和執行AOF檔案中的命令還原資料庫狀態。

AOF持久化的實現:

1.命令追加 2.檔案寫入3.檔案同步 三個步驟

命令追加:

當AOF持久化功能處於開啟狀態時,伺服器在執行一個寫命令之後,會以協議格式將被執行的寫命令追加到伺服器的aof_buf快取區的末尾:

檔案寫入與同步:

Redis的伺服器程式就是一個事件迴圈(loop),這個迴圈中的檔案事件負責接收客戶端的命令請求,以及向客戶端傳送命令回覆,而時間事件是負責執行定時執行函式(serverContron)。

因為伺服器處理檔案事件會執行寫命令,使一些內容追加到aof_buf緩衝區裡,所以伺服器每次在結束一個事件迴圈之前,都會呼叫flushAppendOnlyFile函式,考慮是否將aof_buf緩衝區的內容寫入和儲存到Aof檔案裡。

因為AOF檔案的更新頻率比RDB檔案的更新頻率高,所以:

1如果伺服器開啟了AOF持久化功能,那麼伺服器會優先使用AOF檔案來還原資料庫狀態。

2只有在AOF持久化功能處於關閉狀態的時候,伺服器才會使用RDB檔案來還原資料庫狀態。

相關文章