線程模型
單線程爲什麼還這麼快?
-
單線程指的是網絡IO,SET,GET等命令是單線程。持久化、集羣同步是由另外的線程完成。
-
大部分的操作在內存中完成。高效的數據結構(跳錶等)
-
單線程避免了上線文的切換。
-
多路複用IO
-
4.0之後添加了多線程的異步刪除。
-
6.0之後添加了IO讀寫併發能力。
高可用
數據不丟失?持久化
-
AOF
-
RDB:生成快照:bgsave/save
-
4.0之後添加了先以RDB寫入,然後把後續命令以AOF方式寫入。
集羣模式
主從+哨兵
數據丟失:
-
腦裂
-
主從複製
數據丟失解決辦法:
-
保證數據最少同步到一個cluster算寫入成功
-
如果10S沒有複製到cluster完成,則master拒絕寫請求。
原理:redis的sub/pub,每個哨兵都向redis的chanel裏面發送消息
RedisCluster
-
hash槽的分配:創建cluster的時候平均分配,總數爲16384個槽
-
手動分配:cluster meet命令手動分配
雪崩
導致redis服務掛掉
解決辦法:
-
事前:redis高可用;緩存的失效時間隨機打散,避免在一個時間點全部失效。
-
事中:添加二級緩存
-
事後:從磁盤恢復。
穿透
- 大量請求在redis中沒有找到,落到了數據庫上。
解決辦法:
- key set null
隨機key攻擊redis:
- 布隆過濾器解決
熱key
-
解釋:突然有大量的請求訪問某個特定的key,造成流量過於集中,到達物理網卡的上限,導致redis服務器掛了,然後直接打到數據庫上。
-
解決:二級緩存,找到熱key,加載到多臺redis上。
緩存併發
-
解釋:併發請求某個特定的key,但是這個key在redis中不存在,都要做這個操作:去數據庫查找並且更新到redis中。
-
解決:如果redis中不存在,使用setnx給key加鎖。如果加鎖成功,則從數據庫獲取到數據後寫入redis;如果加鎖失敗,則休眠N秒後繼續從redis中請求。
Redis緩存清理策略
- 解釋:當緩存達到Redis設置的內存大小時,會清理掉部分數據。默認策略爲LRU(將最近最少使用的清除)
Redis過期策略:
-
定時刪除:在SET的時候生成一個定時器,用於處理過期。佔用資源多。
-
定期刪除:在SET的時候,將需要過期的KEY單獨存放到了一個字典裏面。每隔100ms隨機去N個Key執行過期處理;如果1/4的key過時,則循環執行下一次。採用貪心策略
-
惰性刪除,在GET的時候去判斷是否過期
-
默認採用定期過期+惰性過期