Redis的常見知識點

Redis:

一、使用Redis有哪些好處?

(1) 速度快,因爲數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
(2) 支持豐富數據類型,string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

二、爲什麼redis需要把所有數據放到內存中?

    Redis爲了達到最快的讀寫速度將數據都讀到內存中,並通過異步的方式將數據寫入磁盤。所以redis具有快速和數據持久化的特徵。
    如果不將數據放在內存中,磁盤I/O速度爲嚴重影響redis的性能。

三、Redis是單進程單線程的?

    redis利用隊列技術將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷。 

四、redis主從複製?

    redis主從配置比較簡單,基本就是在從節點配置文件加上:slaveof 192.168.33.130 6379
主要是通過master server持久化的rdb文件實現的。master server 先dump出內存快照文件,然後將rdb文件傳給slave server,slave server 根據rdb文件重建內存表。
    redis複製過程如下:
1、slave server啓動連接到master server之後,salve server主動發送SYNC命令給master server
2、master server接受SYNC命令之後,判斷,是否有正在進行內存快照的子進程,如果有,則等待其結束,否則,fork一個子進程,子進程把內存數據保存爲文件,併發送給slave server
3、master server子進程進程做數據快照時,父進程可以繼續接收client端請求寫數據,此時,父進程把新寫入的數據放到待發送緩存隊列中
4、slave server 接收內存快照文件之後,清空內存數據,根據接收的快照文件,重建內存表數據結構
5、master server把快照文件發送完畢之後,發送緩存隊列中保存的子進程快照期間改變的數據給slave server,slave server做相同處理,保存數據一致性
6、master server 後續接收的數據,都會通過步驟1建立的連接,把數據發送到slave server

需要注意:slave server如果因爲網絡或其他原因斷與master server的連接,當slave server重新連接時,需要重新獲取master server的內存快照文件,slave server的數據會自動全部清空,然後再重新建立內存表,這樣會讓slave server 啓動恢復服務比較慢,同時也給master server帶來較大壓力,可以看出redis的複製沒有增量複製的概念,這是redis主從複製的一個主要弊端,在實際環境中,儘量規避中途增加從庫redis2.8之前不支持增量,到2.8之後就支持增量了!

原則:Master會將數據同步到slave,而slave不會將數據同步到master。Slave啓動時會連接master來同步數據。    這是一個典型的分佈式讀寫分離模型。我們可以利用master來插入數據,slave提供檢索服務,這樣可以有效減少單個機器的併發訪問數量。 讀寫分離架構的缺陷在於,不管是Master還是Slave,每個節點都必須保存完整的數據,如果在數據量很大的情況下,集羣的擴展能力還是受限於單個節點的存儲能力,而且對於Write-intensive類型的應用,讀寫分離架構並不適合。


redis:會週期性的把數據寫入磁盤或者修改操作寫入追加的記錄文件,並在基礎上實現了master-slave(主從)同步。
重要的特點:實現數據持久化
    1.使用RDB快照的方式,將內存中的數據不斷寫入磁盤;會出現數據丟失
    2.使用AOF日誌方式,記錄每次更新的日誌。即每條會使Redis內存數據發生改變的命令都會追加到一個log文件中,也就是說這個log文件就是Redis的持久化數據。

缺陷:由於主從之間是異步傳輸,所以存在丟失數據的風險。
    例如:客戶端寫主節點B,B回覆客戶端OK,B傳送寫操作到從節點B1、B2和B3. 由於B在回覆客戶端前,不會等待從節點的確認。所以如果此時B發生故障,雖然從節點會被推舉出一個主節點,但是還沒有傳送到從節點的數據將
永遠丟失了。

六、redis常見性能問題和解決方案

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件
(2) 如果數據比較重要,某個Slave開啓AOF備份數據,策略設置爲每秒同步一次
(3) 爲了主從複製的速度和連接的穩定性,Master和Slave最好在同一個局域網內
(4) 儘量避免在壓力很大的主庫上增加從庫

七、redis集羣:

     Redis Cluster是一個實現了分佈式且允許單點故障的Redis高級版本,沒有中心節點,各個節點地位一致,具有線性可伸縮的功能。

redis集羣羣優點:
1.主從備份,防止主機宕機。
2.讀寫分離,分擔master的任務。
3.任務分離,分擔工作與計算。
----
方案
1.master下面有兩個孩子,兩個孩子直接指向master(樹).
2.線性,第一個孩子指向master,第二個孩子指向第一個孩子.

原理
主從通信:slave啓動之後連接master,slave發出同步命令,slave拿到dump出的rdb
快照,之後再拿緩衝aof隊列中的日誌數據進行數據填充。
---master配置:
1.關閉rdb快照(備份工作交給slave)
2.可以開啓aof

Redis Cluster
1.分佈式存儲架構:
    節點之間通過二進制協議進行通信,節點與客戶端之間通過ascii協議進行通信。
2.數據的放置策略:
    Redis Cluster將整個key的數值域分成16384個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是16384    
Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統。

例:--replicas 1 表示我們希望爲集羣中的每個主節點創建一個從節點,由於sedis的集羣最少需要3個主節點,如果我們每個主節點需要一個從節點,那麼最少需要6臺機器(或者說6個實例)。
145、147、148這3個將成爲主節點,140、141、143將依次稱爲主節點的從節點

16384個哈希槽,那麼每一個哈希槽中存的key 和 value是什麼?
當你往Redis Cluster中加入一個Key時,會根據crc16(key) mod 16384計算這個key應該分佈到哪個hash slot中,一個hash slot中會有很多key和value。
你可以理解成表的分區,使用單節點時的redis時只有一個表,所有的key都放在這個表裏;改用Redis Cluster以後會自動爲你生成16384個分區表,
你insert數據時會根據上面的簡單算法來決定你的key應該存在哪個分區,每個分區裏有很多key。

redis cluster(集羣)
3.0之後的功能,至少需要3(Master)+3(Slave)才能建立集羣,是無中心的分佈式存儲架構,可以在多個節點之間進行數據共享,解決了Redis高可用、可擴展等問題。
Redis集羣提供了以下兩個好處
1、將數據自動切分(split)到多個節點
2、當集羣中的某一個節點故障時,redis還可以繼續處理客戶端的請求。
    一個 redis 集羣包含 16384 個哈希槽(hash slot),數據庫中的每個數據都屬於這16384個哈希槽中的一個。集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。
    集羣中的每一個節點負責處理一部分哈希槽。
集羣中的主從複製
    集羣中的每個節點都有1個至N個複製品,其中一個爲主節點,其餘的爲從節點,如果主節點下線了,集羣就會把這個主節點的一個從節點設置爲新的主節點,繼續工作。
    這樣集羣就不會因爲一個主節點的下線而無法正常工作
注意:
1、如果某一個主節點和他所有的從節點都下線的話,redis集羣就會停止工作了。redis集羣不保證數據的強一致性,在特定的情況下,redis集羣會丟失已經被執行過的寫命令
2、使用異步複製(asynchronous replication)是redis 集羣可能會丟失寫命令的其中一個原因,有時候由於網絡原因,如果網絡斷開時間太長,redis集羣就會啓用新的主節點,之前發給主節點的數據就會丟失。

3.一個主節點可以有多個從節點。
當從節點首次或者重連主節點時,主節點會進行後臺存儲,即將數據snapshot爲磁盤上的rdb文件,
也將rdb文件發給從節點進行存儲。
後臺存儲過程中以及之後的產生的寫操作,主節點都會異步的發送到從節點,從節點執行這些操作以保證數據同步。
默認情況下,從節點對客戶端只提供讀服務。

==================================

七、MySQL裏有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據?

   相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。





發佈了31 篇原創文章 · 獲贊 13 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章