redis都有哪些數據類型
String hash list set sorted set
String是最簡單的類型,就是普通的set和get,做簡單的KV緩存
hash類似map的一種結構,這個一般就是可以將將結構化的數據,比如一個對象給緩存在Redis裏,然後每次讀寫緩存的時候,可以就操作hash裏的某個字段
list有序列表,存儲列表型的數據結構,類似粉絲列表,文章評論列表
set是無序集合,自動去重。直接基於set將系統裏需要去重的數據扔進去就給去重
sorted set 是排序的set 去重但可以排序,寫進去的時候給一個分數自動根據分數排序
緩存雪崩
對於系統A,假設每天高峯期每秒5000個請求,本來緩存在高峯期可以抗住每秒4000個請求,但是緩存機器意外發生了宕機,緩存掛了,請求全部落入數據庫,必然扛不住報警。此時,如果沒采取什麼方案處理故障,數據庫會被新的流量打死。
解決方案
Redis高可用 主從+哨兵 本地緩存+限流降級 Redis持久化
緩存穿透
對於系統A假設一秒5000個請求,其中4000個請求是黑客發出的惡意攻擊。
黑客發出的4000個攻擊,緩存中查不到去庫裏查也查不到數據庫id從1開始的,黑客發過來的id是負數,緩存中不會有請求視緩存於無物,查詢數據庫這種惡意攻擊場景的緩存穿透就會直接把數據庫打死的。
解決方案
寫一個空值到緩存裏去,設置過期時間。布隆過濾器
緩存擊穿
某個key非常熱點,訪問非常頻繁處於集中式高併發訪問的情況,當這個key在失效的瞬間大量的請求擊穿了緩存直接請求數據庫,就像是在一道屏障上鑿開了一個洞。
解決方式
可以將熱點數據設置爲永遠不過期;或者基於 redis or zookeeper 實現互斥鎖,等待第一個請求構建完緩存之後,再釋放鎖,進而其它請求才能通過該 key 訪問數據。