天天看點

這可能是Redis比較全的知識整理Redis和zookeeper做分布式鎖的差別,redis為什麼适合做分布式鎖,它又存在什麼問題Redis如何實作mq的功能Redis實作的消息隊列功能和mq有什麼差別redis單線程為什麼執行速度這麼快?Redis key 的過期時間和永久有效分别怎麼設定?Redis 叢集的主從複制模型是怎樣的?Redis單線程為什麼執行速度這麼快?Redis的過期鍵删除政策Redis的記憶體淘汰Redis緩存和MySQL資料一緻性方案

Redis和zookeeper做分布式鎖的差別,redis為什麼适合做分布式鎖,它又存在什麼問題

todo

Redis如何實作mq的功能

todo

Redis實作的消息隊列功能和mq有什麼差別

todo

redis單線程為什麼執行速度這麼快?

(1):純記憶體操作,避免大量通路資料庫,減少直接讀取磁盤資料,redis将資料儲存在記憶體裡面,讀寫資料的時候都不會受到硬碟 I/O 速度的限制,是以速度快

(2):單線程操作,避免了不必要的上下文切換和競争條件,也不存在多程序或者多線程導緻的切換而消耗CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗

(3):采用了非阻塞I/O多路複用機制

Redis key 的過期時間和永久有效分别怎麼設定?

EXPIRE 和 PERSIST 指令。

Redis 叢集的主從複制模型是怎樣的?

(1)全量拷貝,

1. slave第一次啟動時,連接配接Master,發送PSYNC指令,
2. master會執行bgsave指令來生成rdb檔案,期間的所有寫指令将被寫入緩沖區。
3. master bgsave執行完畢,向slave發送rdb檔案
4. slave收到rdb檔案,丢棄所有舊資料,開始載入rdb檔案
5. rdb檔案同步結束之後,slave執行從master緩沖區發送過來的是以寫指令。
6. 此後 master 每執行一個寫指令,就向slave發送相同的寫指令。
           

(2):增量拷貝

​ 如果出現網絡閃斷或者指令丢失等異常情況,從節點之前儲存了自身已複制的偏移量和主節點的運作ID

Redis單線程為什麼執行速度這麼快?

  1. 避免了不必要的上下文切換和競争條件
  2. 也不存在多程序或者多線程導緻的切換而消耗CPU,不用去考慮各種鎖的問題,
  3. 不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗;

Redis的過期鍵删除政策

  • 定時删除:在設定鍵的過期時間的同時,建立一個定時器,讓定時器在鍵的過期時間來臨時,立即執行對鍵的删除操作。
  • 惰性删除:放任過期鍵不管,每次從鍵空間中擷取鍵時,檢查該鍵是否過期,如果過期,就删除該鍵,如果沒有過期,就傳回該鍵。
  • 定期删除:每隔一段時間,程式對資料庫進行一次檢查,删除裡面的過期鍵,至于要删除哪些資料庫的哪些過期鍵,則由算法決定。

Redis的記憶體淘汰

  • noeviction(預設政策):對于寫請求不再提供服務,直接傳回錯誤(DEL請求和部分特殊請求除外)
  • allkeys-lru:從所有key中使用LRU算法進行淘汰
  • volatile-lru:從設定了過期時間的key中使用LRU算法進行淘汰
  • allkeys-random:從所有key中随機淘汰資料
  • volatile-random:從設定了過期時間的key中随機淘汰
  • volatile-ttl:在設定了過期時間的key中,根據key的過期時間進行淘汰,越早過期的越優先被淘汰

Redis緩存和MySQL資料一緻性方案

  1. 采用延時雙删政策

    就是確定讀請求結束,寫請求可以删除讀請求造成的緩存髒資料。

    • 先删除緩存;
    • 再寫資料庫;
    • 休眠500毫秒;
    • 再次删除緩存。
  2. 異步更新緩存(基于訂閱binlog的同步機制)

    讀取binlog後分析 ,利用消息隊列,推送更新各台的redis緩存資料。可以結合使用canal(阿裡的一款開源架構),通過該架構可以對MySQL的binlog進行訂閱