【閱讀筆記】Redis

內存模型

  1. 內存劃分

    1. 數據自己
    2. redis進程運行自己須要的內存
    3. 緩衝區
    4. 內存碎片
  2. 存儲細節

    1. 數據模型
      html

      1. dicEntry:每個鍵值對(Key-Value)都會有一個dicEntry。
      2. Key:redis key,以SDS的格式存儲
      3. redisObject:redis value,以redisObject的格式存儲。
    2. jemallocredis

      redis默認的內存分配器。數據庫

    3. RedisObject數組

      redis中的全部數據都是以RedisObject的形式存儲的。服務器

      typedef struct redisObject {
        unsigned type:4;
        unsigned encoding:4;
        unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
        int refcount;
        void *ptr;
      } robj;
    4. SDS數據結構

      SDS(Simple Dynamic String),Redis採用SDS來標識字符串架構

      struct sdshdr {
          int len;
          int free;
          char buf[];
      };

      buf表示字節數組,用來存儲字符串;len表示buf已使用的長度,free表示buf未使用的長度。下面是兩個例子。負載均衡

  3. 對象類型

    redis支持五種類型的數據。ide

    1. 字符串日誌

      • redis最基礎的類型,字符串的長度不能超過512MB
    2. 哈希

      • 哈希時redis支持的五種數據類型一直,redis做爲key-value數據庫自己所使用的數據結構
    3. 列表

      • 列表(list)用來存儲多個有序的字符串,每一個字符串稱爲元素;

      • 一個列表能夠存儲2^32-1個元素。

      • Redis中的列表支持兩端插入和彈出,並能夠得到指定位置(或範圍)的元素,能夠充當數組、隊列、棧等。

    4. 集合

      • 集合(set)與列表相似,都是用來保存多個字符串;
      • 集合與列表有兩點不一樣:集合中的元素是無序的,所以不能經過索引來操做元素;集合中的元素不能有重複。
      • 一個集合中最多能夠存儲2^32-1個元素;
      • 除了支持常規的增刪改查,Redis還支持多個集合取交集、並集、差集。
    5. 有序集合

      • 有序集合與集合同樣,元素都不能重複;
      • 但與集合不一樣的是,有序集合中的元素是有順序的。
      • 與列表使用索引下標做爲排序依據不一樣,有序集合爲每一個元素設置一個分數(score)做爲排序依據。

持久化

持久化即備份,這是高可用的策略之一,有了備份,就能夠在Redis故障經過備份進行恢復。redis持久化主要有RDB和AOF。

  1. RDB

    RDB(Redis DataBase),基於策略定時將redis內存中的數據保存到硬盤。須要時能夠經過這個備份文件進行恢復。

  2. AOF

    AOF(Append Only File),是把每次redis執行的命令記錄到日誌文件中(相似於MySql的Bin log),當Redis啓動時能夠經過執行log中的命令來恢復數據。

主從複製

主從複製,是把一臺redis服務器上數據複製到其餘服務器的機制,其中前者被稱爲主節點(master)。後者被稱爲從節點(slave)。

上面說的持久化是解決單機備份問題(內存到硬盤),主從複製主要解決數據在多機器之間的熱備份,實現負載均衡和故障恢復。

主從複製的主要主要做用:

  1. 數據冗餘:數據熱備,多機備份。
  2. 故障恢復:當主節點出現問題時,能夠讓從節點提供服務,是一種功能的冗餘。
  3. 負載均衡:能夠讓主節點寫,從節點多,能夠把壓力分配到多個從節點,從而實現負載均衡。
  4. 高可用基石:主從複製時實現哨兵和集羣的基礎。

哨兵

哨兵,Redis sentinel,在主從複製的基礎上實現故障恢復的自動化。其核心功能是主節點(master)的自動故障轉移

主要功能:

  1. 監控(Monitor):哨兵不斷檢查主節點和從節點是否正常工做
  2. 自動故障轉移(Automatic failover):主節點不正常時,哨兵啓動自動故障轉移,它會將失效主節點的其中一個從節點升級爲新的主節點,並讓其餘從節點從這個新的主節點複製數據。
  3. 配置提供着(Configuration provider):客戶端能夠經過哨兵來獲取主節點地址。
  4. 通知(Notification):哨兵能夠把故障轉移結果通知給客戶端。

架構

它由兩部分組成,哨兵節點和數據節點:

  1. 哨兵節點:哨兵系統由一個或多個哨兵節點組成,哨兵節點是特殊的redis節點,不存儲數據

  2. 數據節點:主節點和從節點都是數據節點。

集羣

持久化實現了單機的備份,主從解決了多機的熱備份,以及讀的操做的負載均衡,最終經過哨兵實現了主節點的自動故障遷移。

目前還有一個核心問題,主節點只有一個,寫操做只能寫到一個節點,尚未實現負載均衡,存儲能力徹底受限於單機的存儲能力。

集羣就是用來解決寫操做負載均衡的問題。其核心就是數據分片。集羣將數據分散到不一樣的集羣上,解決單機存儲能力受限的問題。

閱讀的博客:https://www.cnblogs.com/kismetv/category/1186633.html

相關文章
相關標籤/搜索