關於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
- 關於 performSelector 的一些小探討performSelector
- win10 下關於redis的相關問題Win10Redis
- 【redis】關於查詢和分析redis中的bigkeys問題Redis
- 一些小問題彙總
- 關於網頁的一些小知識點網頁
- 小程式專案中的一些小問題
- vue工作中遇到的一些小問題Vue
- 關於spring事務原始碼的一些小理解Spring原始碼
- 關於SAP PLM實施的一些小體會
- 關於Integer面試的一個問題面試
- 關於巨集奕培訓的一些小筆記(三)筆記
- 關於this指向的問題
- 關於一個歸檔問題?
- 面試中關於Redis的問題看這篇就夠了面試Redis
- 面試遇到的redis相關問題面試Redis
- 【董天一】關於IPFS的熱門問題
- 想知道一些關於 LearnKu 的問題
- Elasticsearch中關於transform的一個問題分析ElasticsearchORM
- 關於DrawerLayout的小問題
- 關於javascript的this指向問題JavaScript
- 關於 Puerts 的效能問題
- 關於盒模型相關的問題模型
- 教你如何解決PostgreSQL Array使用中的一些小問題SQL
- 關於 Swoft 2.0 版本用 Redis 儲存 session 時配置問題RedisSession
- 關於 django-ckeditor 前段使用的一個問題Django
- [20180419]關於閃回的一些問題.txt
- 關於layui的彈窗:一閃而過的問題UI
- redis13_redis快取相關問題5Redis快取
- 【vuejs】有關vue的一些小技巧VueJS
- 有關python的一些小知識Python
- 關於Linux一些問題和答案Linux
- 關於 Laravel 分頁的問題?Laravel
- [20191129]關於hugepages的問題.txt
- 關於hanlp2.0的問題HanLP
- 關於PHP佇列的問題PHP佇列