關於Redis的一些小問題
剛剛學習了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檔案來還原資料庫狀態。
相關文章
- 關於資料庫連線的一些小問題資料庫
- Leetcode刷題中關於java的一些小問題LeetCodeJava
- 關於css佈局、居中的問題以及一些小技巧CSS
- 關於redis配置找不到問題Redis
- 關於MySQL的一些小見解MySql
- win10 下關於redis的相關問題Win10Redis
- 一些小問題彙總
- 關於 performSelector 的一些小探討performSelector
- 關於繼承的一些小總結繼承
- 關於網頁的一些小知識點網頁
- 關於教程的一個問題
- 小程式專案中的一些小問題
- vue工作中遇到的一些小問題Vue
- Android studio遇到的一些小問題Android
- 關於Integer面試的一個問題面試
- 一個關於Java Excel的問題JavaExcel
- 一個關於SessionBean呼叫的問題。SessionBean
- 一個關於prototype模式的問題?模式
- 問一個關於hibernate的OracleDialect問題Oracle
- 面試遇到的redis相關問題面試Redis
- 關於spring事務原始碼的一些小理解Spring原始碼
- 關於巨集奕培訓的一些小筆記(三)筆記
- 面試中關於Redis的問題看這篇就夠了面試Redis
- 關於rails效能的那些小事兒AI
- 求助關於JdonFrameworkTest的一個問題Framework
- 關於系統效能的一個問題
- 一個關於jdbc2的問題JDBC
- 關於jdbc的一個問題,高手解惑JDBC
- 關於抽象工廠的一個問題?抽象
- 爭用!!!!一個關於JDBC的問題!JDBC
- 關於singleton模式的一個問題?模式
- 碰到一個棘手的問題——關於httpclient。HTTPclient
- 關於網路的一點問題(轉)
- 關於一個歸檔問題?
- 關於SQLServerDriver的問題SQLServer
- 關於 JavaMail 的問題JavaAI
- 關於session的問題Session
- 一個一直困惑的關於jdbc in 的問題JDBC