深入理解Redis原理

Redis簡述

    Redis是一種內存型的非關係型數據庫,因爲其優秀的性能,經常被用來做緩存(當然也可以作爲一種消息隊列)。Redis支持豐富的數據類型:String、List、Set、ZSet和Hash。爲了節省內存,Redis的每種數據類型都存在不同的存儲策略來滿足需要。比如Hash,數據量較少時,採用數組緊密存儲的結構,會在數據量增加駕到某個臨界點時切換到HashMap的方式。

    Redis可以抽象理解爲一個HashMap,用來存儲各種不同的數據。它會把我們的value包裝一層編程RedisObject,然後內部通過數據類型、存儲地址、編碼格式、內存回收策略(上一次被程序訪問的時間)、共享對象被引用計數等屬性來管理value。

    Redis解決高併發是通過將任務加入隊列順序執行的方式來完成的。也就意味着Redis是脆弱的,如果不顧一切的搞它,它會懷孕的(開個玩笑)。爲了防止Redis崩潰,或者Redis崩潰以後的恢復,Redis想了很多種方案來解決。要想了解這一切,就需要深入瞭解Redis了。

Redis內存劃分

(1)數據

        指的就是我們放到Redis裏存儲的數據。

(2)進程本身

        Redis本身也是個程序,對於操作系統來說,也需要分配內存來執行它。

(3)緩衝內存

         1)爲了應對客戶端大量寫入,設置客戶端緩衝區;

         2)爲了滿足部分複製功能,設置複製積壓緩衝區;

         3)爲了於在進行AOF重寫時,保存最近的寫入命令,設置AOF緩衝區。

(4)內存碎片

         因爲Redis回採取不同的存儲策略來應對不同數據量情況下的數據存儲,就不可避免的產生了一些內存碎片。

Redis數據存儲

 (1)內存分配器:

        相當於Redis的大腦,負責給每個數據分配相應的內存來存儲;

 (2)簡單動態字符串:

          用於存儲key;

 (3)RedisObject:

          用於存儲value,任何value 都會被轉換爲RedisObject進行存儲。然後內部通過數據類型、存儲地址、編碼格式、內存回收策略(上一次被程序訪問的時間)、共享對象被引用計數等屬性來管理value。

typedef struct redisObject {
  unsigned type:4; //數據類型(String、List、Set、ZSet和Hash)
  unsigned encoding:4; //內部編碼(每種數據類型都有好幾種數據存儲方式)
  unsigned lru:REDIS_LRU_BITS; //上一次被程序訪問的時間
  int refcount; //共享對象被引用次數計數
  void *ptr; //存儲地址
} 

Redis高可用

      廣義的高可用指的是一個程序在對長時間內可以正常提供服務。Redis中對廣義高可用進行了擴展,除了保證提供正常服務(如主從分離、快速容災技術),還需要考慮數據容量的擴展、數據安全不會丟失等。 在Redis中,實現高可用的技術主要包括數據持久化到磁盤、主從備份、哨兵和集羣。

1. 數據持久化到磁盤

    Redis是一個內存型數據庫,爲了滿足重啓後數據的恢復,採用了將數據寫入磁盤的方式進行持久化,重啓時重新載入。Redis採用了兩種方案進行持久化:RDB和AOF:

    RDB的做法是:每隔一段時間,自動(自動觸發最常見的情況是在配置文件中通過save m n,指定當m秒內發生n次變化時,會觸發bgsave)或手動的將數據生成數據快照寫入磁盤(所以不是實時的,存在丟數據的問題)。

    AOF的做法是:實時的將Redis執行的每次寫命令記錄到單獨的日誌文件中(有點像MySQL的binlog);當Redis重啓時,模擬一個沒有網絡連接的客戶端從磁盤中直接讀取並執行AOF文件中的命令來恢復數據。

   兩者的關係:

    當AOF開啓,且AOF文件存在時,Redis啓動時會優先載入AOF文件來恢復數據;

    當AOF開啓,但AOF文件不存在時,即使RDB文件存在也不會加載

    只有當AOF關閉時,纔會載入RDB文件恢復數據。 

2. 主從備份

     主從備份,是指將一臺Redis服務器的數據,複製到其他的Redis服務器。前者稱爲主節點(master),後者稱爲從節點(slave);數據的複製是單向的,只能由主節點到從節點。

3. 哨兵

      哨兵的核心功能是主節點的自動故障轉移

4.集羣

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