Redis 系列:
- Redis系列(一)Redis入門
- Redis系列(二)Redis的8種資料型別
- Redis系列(三)Redis的事務和Spring Boot整合
- Redis系列(四)Redis組態檔和持久化
- Redis系列(五)發布訂閱模式、主從復制和哨兵模式
- Redis系列(六)Redis 的快取穿透、快取擊穿和快取雪崩
- Redis系列(七)Redis面試題
- Redis命令參考
1、什么是 Redis?有什么特點?
Redis 是一款開源,高性能的 key-value 的非關系型資料庫,
特點:
1)支持持久化,可以將記憶體中的資料持久化到磁盤,重啟可以再次從磁盤中加載使用;
2)支持多種資料結構;
3)支持資料的備份:主從模式的備份;
4)高性能,讀速度達 11 萬次/秒,寫速度達到 8.1 萬次/秒
5)支持事務,
2、說說 Redis 的資料型別
一共 8 種
5 種基本資料型別:String、Hash、List、Set、Zset
3 種特殊型別:geospatial、hyperloglog、bitmap
3、Redis 和 Memcache 的區別?
1)Memcache 資料都存盤在記憶體中,斷電即失,資料不能超過記憶體大小;而 Redis 的資料可以持久化到硬碟,
2) Memcache 只支持簡單的字串,Redis 有豐富的資料結構;
3)底層實作方式不一樣,Redis 自行構建了 VM 機制,速度更快,
4、Redis 是單行程單執行緒的?
Redis 將資料放在記憶體中,單執行緒執行最高,多執行緒執行反而需要進行 CPU 背景關系切換,這是個耗時操作,單執行緒效率最高,
5、說說 Redis的持久化
Redis 提供了兩種持久化機制:RDB 和 AOF
RDB 持久化機制指的是,用資料集快照的方式記錄 Redis 資料庫的所有鍵值對,在某個時間點寫入一個臨時檔案,持久化結束后,用這個臨時檔案替換上次持久化的檔案,達到資料恢復的目的,
優點:
1)只有一個檔案 dump.rdb 方便持久化;
2)容災性好,一個檔案可以保存到安全的磁盤;
3)性能最大化,Redis 會單獨創建(fork)一個子行程進行持久化,主行程不進行任何 IO 操作,保證了性能;
4)在資料較多時,比 AOF 的啟動效率高,
缺點:
最后一次持久化的資料可能會丟失,
AOF 持久化,是以獨立日志的方式記錄每次寫命令,并在 Redis 重啟時重新執行 AOF 檔案中的命令以達到恢復資料的目的,AOF 主要解決資料持久化的實時性,
優點:
1)資料安全,配置 appendfsync 屬性,可以選擇不同的同步策略;
2)自動修復功能, redis-check-aof工具可以解決資料一致性問題;
缺點:
1)AOF 檔案比 RDB 檔案大,且恢復速度慢;
2)資料多時,效率低于 RDB,
6、Redis 的主從復制
主從復制值的是將一臺 Redis 服務器的資料復制其他 Redis 服務器,前者稱之為主節點,后者稱之為從節點,
主從復制的作用:
1)資料冗余:主從復制實作了資料的熱備份;
2)故障修復:當主節點出現故障后,從節點還可以提供服務,實作快速的故障修復,
3)負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫操作,從節點提供讀操作,實作負載均衡,提高并發量;
4)高可用的基石:主從復制是哨兵模式的基礎,
復制原理:
從節點啟動成功連接到主節點后,會發送一個 sync 的同步命令,主節點接收到命令之后,啟動后臺的存盤行程,收集所有修改資料庫的命令,在后臺執行完畢后將整個資料檔案傳送到從節點,完成一次完全同步,
全量復制:從節點在接收到了資料檔案后,將其存盤檔案加載都記憶體中;
增量復制:主節點繼續將新收集到修改命令傳遞給從節點,完成同步,
7、說說哨兵模式
哨兵模式是為了解決手動切換主節點的問題,Redis 提供了哨兵的命令,哨兵是一個獨立的行程,哨兵能夠后臺監控主節點是否故障,如果故障需要將從節點選舉為主節點,
其原理是哨兵通過發送命令,等待 Redis 服務器的回應,從而監控多個 Redis 節點,
當只有一個哨兵時,還是可能會出現問題的,比如哨兵自己掛掉,為此,可以使用多哨兵模式,多個哨兵之間相互監控,當主節點宕機了,哨兵1先檢測到這個結果,系統并不會馬上進行 failover 【故障轉移】的程序,僅僅是哨兵1認為主節點不可用的現象稱之為主觀下線,當其余的哨兵也檢測到主節點不可用之后,哨兵之間會進行一次投票選舉從節點中的一個作為新的主節點,這個程序稱之為客觀下線,
哨兵模式的優點:
1)基于主從復制,高可用;
2)主從可以切換,進行故障轉移,系統可用性好;
3)哨兵模式是主從模式的升級版,手動到自動,更加健壯,
哨兵模式的缺點:
1)不方便在線擴容;
2)實作哨兵模式需要很多的配置,
8、快取穿透、快取擊穿和快取雪崩
快取穿透:
概念:用戶需要查詢一個資料,快取中沒有,也就是沒有命中,于是向資料庫中發起請求,發現也沒有,當用戶很多的時候,快取都沒有命中,于是都去請求資料庫,這給資料庫造成很大的壓力,
解決方案:
- 布隆過濾器:是一種資料結構,對所有可能查詢的引數以 hash 方式存盤,先在控制層進行校驗,不符合則丟棄,避免了過多訪問資料庫,
- 快取空物件:當存盤層沒有命中時,即使回傳空物件也將其快取起來,(意味著更多的空間存盤,即使設定了過期時間,快取和資料庫還是有段時間資料不一致,)
快取擊穿:
概念:當一個 key 非常熱點時,在不斷扛高并發,集中對這個熱點資料進行訪問,當這個 key 失效的瞬間,請求直接到達資料庫,給資料庫瞬間的高壓力,
解決方案:
- 設定熱點資料永不過期
- 加分布式鎖:保證每個 key 同時只有一個執行緒去查詢后端服務,
快取雪崩:
概念:某個時間段,快取集中失效
解決方案:
- 增加 Redis 集群的數量
- 限流降級:在快取失效后,通過加鎖和佇列來控制資料庫寫快取的執行緒數量
- 資料預熱:正式部署之前,將資料預先訪問一遍,讓快取失效的時間盡量均勻
9、Redis 的使用場景
1)會話快取:如 單點登錄,使用 Redis 模擬 session,SSO 系統生成一個 token,將用戶資訊存到 Redis 中,并設定過期時間;
2)全頁快取
3)作為訊息佇列平臺
4)排行榜和計數器
5)發布/訂閱:比如聊天系統
6)熱點資料:比如ES中搜索的熱詞
10、Redis 快取如何保持一致性
讀資料的時候首先去 Redis 中讀取,沒有讀到再去 MySQL 中讀取,讀取都資料更新到 Redis 中作為下一次的快取,
寫資料的時候會產生資料不一致的問題,無論是先寫入 Redis 再寫入 MySQL 中,還是先寫入 MySQL 再寫入 Redis 中,這兩步操作都不能保證原子性,所以會出現 Redis 和 MySQL 中資料不一致的問題,
無論采取何種方式都不能保證強一致性,如果對 Redis 中的資料設定了過期時間,能夠保證最終一致性,對架構的優化只能降低發生的概率,不能從根本上避免不一致性,
更新快取的兩種方式:洗掉失效快取、更新快取
更新快取和資料庫有兩種順序:先資料庫后快取、先快取后資料庫
兩兩組合,分為四種更新策略,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/3177.html
標籤:NoSQL
下一篇:常用SQL陳述句總結
