Redis 持久化機制
緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題
熱點數據和冷數據是什么
Memcache與Redis的區別都有哪些?
單線程的redis為什么這么快
redis的數據類型,以及每種數據類型的使用場景,Redis 內部結構
redis的過期策略以及內存淘汰機制
Redis 為什么是單線程的,優點
如何解決redis的并發競爭key問題
Redis 集群方案應該怎么做?都有哪些方案?
有沒有嘗試進行多機redis 的部署?如何保證數據一致的?
對于大量的請求怎么樣處理
Redis 常見性能問題和解決方案?
講解下Redis線程模型
為什么Redis的操作是原子性的,怎么保證原子性的?
Redis事務
Redis實現分布式鎖
Redis支持多線程的好處
多線程講解:https://www.cnblogs.com/gz666666/p/12901507.html
- 1 可以充分利用服務器 CPU 資源,目前主線程只能利用一個核。
- 2 多線程任務可以分攤 Redis 同步 IO 讀寫負荷。
- Redis 6.0 默認是否開啟了多線程?
否,在conf文件進行配置
io-threads-do-reads yes
io-threads 線程數
官方建議:4 核的機器建議設置為 2 或 3 個線程,8 核的建議設置為 6 個線程,線程數一定要小于機器核數,盡量不超過8個。
開啟多線程后,是否會存在線程并發安全問題?
不會,Redis 的多線程部分只是用來處理網絡數據的讀寫和協議解析,執行命令仍然是單線程順序執行。
Redis 線程中經常提到 IO 多路復用,如何理解?
-
這是 IO 模型的一種,即經典的 Reactor 設計模式,有時也稱為異步阻塞 IO。
-
**多路指的是多個 Socket 連接,復用指的是復用一個線程。**多路復用主要有三種技術:Select,Poll,Epoll。
-
Epoll 是最新的也是目前最好的多路復用技術。采用多路 I/O 復用技術可以讓單個線程高效的處理多個連接請求(盡量減少網絡 IO 的時間消耗),
且 Redis 在內存中操作數據的速度非常快(內存內的操作不會成為這里的性能瓶頸),主要以上兩點造就了 Redis 具有很高的吞吐量。 -
總結:也就是單個線程 處理多個socket,當某一個socket套接字好read or write數據的時候,我們按順序執行(這里是內存中執行,速度非常快)
Redis 6.0 之前的版本真的是單線程嗎?
Redis基于Reactor模式開發了網絡事件處理器,這個處理器被稱為文件事件處理器。
它的組成結構為4部分:多個套接字、IO多路復用程序、文件事件分派器、事件處理器。
因為文件事件分派器隊列的消費是單線程的,所以Redis才叫單線程模型。
- 總結:文件事件分配器 會按順序單線程的處理所有的客戶端請求。
Redis 持久化機制
- Redis是一個支持持久化的內存數據庫,通過持久化機制把內存中的數據同步到硬盤文件來保證數據持久化。當Redis重啟后通過把硬盤文件重新加載到內存,就能達到恢復數據的目的。
- 實現:
- 單獨創建fork()一個子進程,將當前父進程的數據庫數據復制到子進程的內存中,然后由子進程寫入到臨時文件中,
- 持久化的過程結束了,再用這個臨時文件替換上次的快照文件,然后子進程退出,內存釋放。
- RDB是Redis默認的持久化方式。按照一定的時間周期策略把內存的數據以快照的形式保存到硬盤的二進制文件。
即Snapshot快照存儲,對應產生的數據文件為dump.rdb,通過配置文件中的save參數來定義快照的周期。
( 快照可以是其所表示的數據的一個副本,也可以是數據的一個復制品。)- 恢復數據塊
- 容易丟失數據
- AOF:Redis會將每一個收到的寫命令都通過Write函數追加到文件最后,類似于MySQL的binlog。當Redis重啟是會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。
- 缺點:命令重寫指定會更慢
- 優點:但是數據不易丟失,并且如果有那種誤操作,畢竟是可視化的命令就可以直接找出來在文件中刪除。
- 當兩種方式同時開啟時,數據恢復Redis會優先選擇AOF恢復。
緩存雪崩、緩存穿透、緩存預熱、緩存更新、緩存降級等問題
緩存雪崩
-
緩存雪崩我們可以簡單的理解為:由于原有緩存失效,新緩存未到期間
(例如:我們設置緩存時采用了相同的過期時間,在同一時刻出現大面積的緩存過期),所有原本應該訪問緩存的請求都去查詢數據庫了,
而對數據庫CPU和內存造成巨大壓力,嚴重的會造成數據庫宕機。從而形成一系列連鎖反應,造成整個系統崩潰。 -
也可以直接理解為緩存直接都不可用了, 我們可以采取分布式緩存的策略,提高緩存的高可用性
-
解決辦法:
大多數系統設計者考慮用加鎖( 最多的解決方案)或者隊列的方式保證來保證不會有大量的線程對數據庫一次性進行讀寫,從而避免失效時大量的并發請求落到底層存儲系統上。
還有一個簡單方案就時將緩存失效時間分散開。
緩存穿透
- 緩存穿透是指用戶查詢數據,在數據庫沒有,自然在緩存中也不會有。(不恰當的業務、或者惡意的攻擊)這樣就導致用戶查詢的時候,在緩存中找不到,每次都要去數據庫再查詢一遍,
然后返回空(相當于進行了兩次無用的查詢?