Redis-相關概念記錄

Redis內部數據類型

  • SDS(simple dynamic string)
    經過SDS來存儲String,優點:redis

    1. 直接獲取長度,效率更高;
    2. 防止溢出;
    3. 空間分配,釋放策略更加高效;
    4. 二進制安全;
  • 鏈表算法

  • 字典 字典包含哈希表,哈希表再包含哈希節點。數據庫

    1. 自動擴容或者縮容,採起漸進式rehash;
  • 跳錶
    只用於有序列表。segmentfault

  • 整數集合
    集合鍵的底層實現之一,能夠升級或者降級優化空間。安全

  • 壓縮列表
    列表鍵和哈希鍵的底層實現之一,只包含少許的項,均是小整數值時,採用壓縮列表來做爲底層實現。服務器

Redis對象

  • 字符串對象架構

    1. 編碼:int raw(SDS) embstr;
  • 列表對象框架

    1. 編碼:ziplist(壓縮列表) linkedlist(鏈表);
  • 哈希對象dom

    1. 編碼:ziplist(壓縮列表) hashtable(字典);
  • 集合對象工具

    1. 編碼:intset(整數集合) hashtable(字典);
  • 有序集合

    1. 編碼:ziplist(壓縮列表) skiplist(跳錶);

Redis持久化

  • RDB

    1. 將內存中的數據庫狀態保存到磁盤當中。
    2. 方式:SAVE(致使服務器阻塞) BGSAVE(子線程方式,服務器不會阻塞) 配置save參數設置自動觸發條件;
  • AOF

    1. 經過保存服務器執行命令的寫來記錄數據庫狀態。
    2. 步驟:命令追加 文件寫入 文件同步(always everysec no)

Redis事件

  • 文件事件

    1. Reactor模型,同時支持多個客戶端,全部的事件放入隊列單線程處理。
  • 時間事件

    1. 類型:定時時間,週期性事件;
    2. 全部的時間事件經過鏈表的形式組成,如果週期任務,處理完成後,新增長事件在鏈表當中;

Sentinel

  • 基礎概念

    1. 本質上是特殊模式下的Redis服務器;
    2. 經過配置文件制定監視的主服務器;
    3. 經過INFO命令從主服務器獲取從服務器;
  • 選舉相關

    1. 與Redis服務器通訊答覆無效時判斷爲主觀下線;
    2. 與其餘Sentinel協商判斷是否客觀下線;
    3. 選舉Leader(raft算法),進行故障轉移;

集羣

  • 基礎概念
    1. 各個節點經過Gossip協議傳播;
    2. 集羣中的數據庫被分爲16384個slot;
    3. 節點只能使用0號數據庫;

事務

  • 基礎概念
    1. 事務提供一種將多個命令請求打包,而後一次性,按順序地執行多個命令的機制;
    2. WATCH爲樂觀鎖,若事務期間,WATCH監視的鍵至少有一個被修改,則事務失敗;
  • 事務的ACID
    1. 原子性:Redis事務不支持回滾;
    2. 一致性;
    3. 隔離性;
    4. 耐久性;

研發規範

  • Key設計
    1. key的一個格式約定: object-type:id:field 。用":"分隔域,用"."做爲單詞間的鏈接, 如" comment:12345:reply.to "。不推薦含義不清的key和特別長的key。

Redis-Java客戶端

  1. Jedis
  2. Spring-Data-redis
  3. Redisson

內存淘汰策略

  1. noeviction(默認):當內存使用達到閾值的時候,全部引發申請內存的命令會報錯。
  2. allkeys-lru:在主鍵空間中,優先移除最近未使用的key。
  3. volatile-lru:在設置了過時時間的鍵空間中,優先移除最近未使用的key。
  4. allkeys-random:在主鍵空間中,隨機移除某個key。
  5. volatile-random:在設置了過時時間的鍵空間中,隨機移除某個key。
  6. volatile-ttl:在設置了過時時間的鍵空間中,具備更早過時時間的 key 優先移除。

內存使用相關

  1. 若是一個Redis實例的內存使用率超過可用最大內存 (used_memory > 可用最大內存),那麼操做系統開始進行內存與swap空間交換,把內存中舊的或再也不使用的內容寫入硬盤上(硬盤上的這塊空間叫Swap分區),以便騰出新的物理內存給新頁或活動頁(page)使用;
  2. mem_fragmentation_ratio>1:Redis沒有內存回收機制,若是批量過時數據或者 刪除數據,內存的碎片可能就比較大;
  3. mem_fragmentation_ratio<1:通常發生在內存緊張的服務器,就是自己內存剩餘不 多,redis申請不到足夠的內存,這樣就會使用swap;

分片

  • 優點
    1. 更多的內存;
    2. 更多的cpu,帶寬;
  • 劣勢
    1. 不能直接的作多鍵相關的操做;
    2. 涉及多鍵的事務不支持;
    3. 分片是按照Key來劃分,對單Key,可是value數據量很大的場景無效;
    4. 擴容有必定難度;
  • 實現方式
    1. 客戶端分片;
    2. 代理分片(Twemproxy)
    3. 查詢路由(Redis cluster)

高可用

  1. 主備切換:Sentinel
  2. 分片採用:tewmproxy
  3. keepalived爲tewmproxy提供VIP
  4. 直接使用Redis Cluster
  5. 其餘公司提供:Codis

應用場景

  • Redis存儲會話
    1. 使用容器拓展實現;
    2. 自定義會話管理;
    3. 使用框架的會話管理工具;

參考列表:

  1. Redis內存優化
  2. Redis 高可用架構最佳實踐
相關文章
相關標籤/搜索