Redis常備面試知識點

線程模型

單線程爲什麼還這麼快?
  • 單線程指的是網絡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的時候去判斷是否過期

  • 默認採用定期過期+惰性過期

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章