一文讀懂 Redis

一、redis 簡介

Redis 是 C 語言開發的一個開源高性能鍵值對的_內存數據庫_,可以用來做數據庫、緩存、消息中間件等場景,是一種 NoSQL(not-only sql, 非關係型數據庫) 的數據庫

二、Redis 特點

二、數據類型

下表是我列舉的五種數據類型的特性及其使用場景

三、緩存

數據緩存是 Redis 最重要的一個場景,爲緩存而生,在 springboot 中,一般有兩種使用方式:

四、使用緩存遇到的問題

(1) 數據一致性

在分佈式環境下,緩存和數據庫很容易出現數據一致性問題,如果項目對緩存的要求是強一致性,那就不要使用緩存。

我們只能在項目中使用策略降低緩存與數據庫一致性的概率,是無法保障兩者的強一致性,一般策略包括緩存更新機制,更新數據庫後及時更新緩存、緩存失敗時增加重試機制

(2) 緩存雪崩

在瞭解雪崩潰之前,我們先了解什麼是緩存雪崩現象,假設 A 系統每秒需要處理 5000 個請求,但數據庫每秒只能處理 4000 個請求,某一天,緩存機器出現了宕機,掛了,這時候所有的請求一下子全部落在數據庫上,數據庫肯定扛不住,報警掛掉了,這時候如果沒有采取緩存設施,數據庫又急着用,重新重啓數據庫,剛重啓完成 (有可能沒啓動完),請求又來,數據庫立馬掛掉。這就是雪崩事件,是 Redis 緩存中最致命問題之一 (有一個是穿透)。大家可以看看下圖

出現雪崩事件後不要急不要慌,我們可以在事故前中後三個方面來思考解決方案

我們來看看改造後的數據流程,假設用戶 A 發送一個請求,系統先請求本地 Ehcache 是否有數據,如果沒有再去 Redis 請求數據,如果沒有再去數據庫請求數據,獲取到數據後同步到 Ehcache 和 redis

限流組件的作用:可以設置每秒請求數次,有多少通過請求,剩餘的未通過的可以走降級處理,返回一些默認的值,或者友情提示等默認操作。具體流程可以看看下圖:

這樣做的好處是:

(3) 緩存穿透

緩存穿透是指緩存和數據庫中都沒有的數據,用戶 (黑客) 不斷髮起請求,導致請求直接查詢數據庫,這種惡意行爲攻擊場景的會直接導致數據庫掛掉,數據流程如下圖所示

image

處理這種情況相對比較簡單點,這種情況是繞過 redis 或本地緩存直接到達數據庫,可以採取以下方案:

(4) 緩存擊穿

上面講的穿透是針對大面積數據請求,那麼擊穿是針對一點 (一個 key) 來來導致 redis 異常,但某個 key 是非常熱點,請求非常頻繁,處於集中式訪問現象,當這個 key 失效 (過期) 時,大量的請求就會擊穿了緩存,直接請求數據庫,就像在屏障中鑿開了一個洞。

不同場景下緩存擊穿解決方案

五、爲什麼 Redis 會如此快

Redis 官方介紹可以達到 10W + 的 QPS,這個數據不比 MEMCache 差,而且 Redis 是單進程單線程的模型,完全基於內存的操作,CPU 不是 Redis 的瓶頸,Redis 的瓶頸是內存及網絡帶寬,有以下特點:

六、Redis 淘汰策略

七、Redis 持久化

Redis 持久化策略有兩種:

如果非常關心你的數據,但仍然可以承受數分鐘內的數據丟失,那麼可以額只使用 RDB 持久。

AOF 將 Redis 執行的每一條命令追加到磁盤中,處理巨大的寫入會降低 Redis 的性能,不知道你是否可以接受。

數據庫備份和災難恢復:定時生成 RDB 快照非常便於進行數據庫備份,並且 RDB 恢復數據集的速度也要比 AOF 恢復的速度快。

當然了,Redis 支持同時開啓 RDB 和 AOF,系統重啓後,Redis 會優先使用 AOF 來恢復數據,這樣丟失的數據會最少。

八、Redis 主從複製

九、Redis 哨兵模式

我們先說說主從複製會存在問題:

哨兵的架構模式如下:

該系統可以執行以下四個任務:

作者:MicroStone123

來源:https://www.jianshu.com/p/0a1c9fc23c01

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/iXq5YnzU-F1cPlL11YzNJw