redis是一種支持key-value等多種數據結構的存儲系統,可用於緩存,事件發佈,消息隊列等場景,支持多種數據類型node
string、hash、list、set、zset。並且基於內存,可持久化,而且可以經過sentinel哨兵和自動分區cluster實現高可用。redis
補充:redis中list集合是雙端循環列表(雙向列表),能夠看成隊列使用,也能看成堆棧使用。算法
redis的持久化策略有兩種:數據庫
RDB模式:按期將內存中的數據進行持久化,實際上就是爲內存作快照,備份速度快,但有可能會丟失少許的數據。緩存
AOF模式:能夠實時備份,安全性更好,但持久化速度較慢,AOF持久化文件的體積很大,數據恢復時須要耗費大量時間。安全
RDB模式是默認開啓的,若兩種模式同時開啓優先採用AOF模式。數據結構
使用分片能夠實現內存數據的動態擴容,每臺redis節點中儘量保存1/n的數據量,防止數據丟失。架構
缺點是如有一臺機器宕機,則整個分片將不能正常運行。併發
分片中採用的hash一致性算法:數據結構和算法
數據如何保存:
1.將節點的ip + 算法肯定惟一哈希值,以後在內存中肯定節點的位置
2.保存數據時,根據key進行hash運算,肯定惟一位置
3.根據當前key的位置順時針查找最近的node節點進行掛載
該算法的特性: 均衡性:引入虛擬節點,讓數據均勻分片
單調性:若是node節點新增,能動態實現數據的遷移
分散性:數據分佈在各個節點(解決方案:通常在進行架構設計時,爲了不數據的分散,會要求使用所有的內存空間)
原理:經過哨兵監控主機的狀態,獲取主機和叢機的信息,經過心跳檢測機制,若是3次鏈接沒有響應,則會判定主機宕機,哨兵會從叢機當中選舉一臺充當主機,
舊的主機修復完成後,會充當叢機等待下次選舉。
腦裂: 由於選舉機制投票平票致使出現多臺主機稱之爲腦裂。
解決方案:增長節點的個數。
緩存穿透: 緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷髮起請求,咱們數據庫的 id 都是1開始自增上去的,如發起爲id值爲 -1 的數據或 id 爲特別大不存在的數據。
這時的用戶極可能是攻擊者,攻擊會致使數據庫壓力過大,嚴重會擊垮數據庫。
解決方案: 利用互斥鎖,緩存失效時,先去獲取鎖,獲得鎖以後再去請求數據庫,沒有獲得鎖的就休眠一段時間。
Redis還有一個高級用法布隆過濾器(Bloom Filter)這個也能很好的防止緩存穿透的發生,他的原理也很簡單就是利用高效的數據結構和算法快速判斷出你這個
Key是否在數據庫中存在,不存在你return就行了,存在你就去查了DB刷新KV再return。
緩存雪崩:在高併發下,大量的緩存key在同一時間失效,致使大量的請求落到數據庫上,如活動系統裏面同時進行着很是多的活動,可是在某個時間點全部的活動緩存所有過時。
解決方案:給緩存失效時間設置加上一個隨機值,避免數據集體失效或者作緩存預熱。
緩存擊穿:緩存擊穿是指一個Key,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個Key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個無缺無損的桶上鑿開了一個洞。
解決方案:設置數據永遠不過時。或者加上互斥鎖就能搞定了,或者作緩存預熱。