優點:
redis是一個key_value存儲庫,數據保存在內存中,可以承受高並發讀寫
redis支持多種特性,如 事務 主從 key過期策略 訂閱-發布
支持多種數據類型
單線程處理客戶端請求,節省了上下文切換時間,但是同樣也會不能充分利用多核處理器的優點
缺點
因為數據是保存在內存中的,所以會收機器內存大小的限制
當key過期策略設置不當,或者數據爆發時,可能會導致redis崩潰,需要合理配置key過期策略,哨兵模式以及內存持久化策略
當增加redis從機時,需要從主機同步全部數據,占用大量io
key過期策略
定期刪除 每隔指定時間,隨機抽取設定了過期的key,如果過期則刪除
惰性刪除 當請求是判斷key是否過期,過期刪除,什么都不返回
內存持久化策略:
rdb:在達到 指定的時間間隔和變化次數 將內存中數據持久化存儲到硬盤中
aof:記錄redis的每一次變化,並將數據追加到硬盤文件中,因為記錄了數據的每一次追加,所以文件會比rdb的要大,性能也要差一些
對於aof文件大的問題,當文件達到一定大小時,會觸發rewrite,即從內存中重新持久化一份最新數據,丟棄之前的變化。
比如 a:a1;a:a2;a:a3 aof會保存每一個變化指令,重寫后,只包含最新數據,不再有變化記錄
因為重寫機制的存在,所以要合理配置 文件重寫的大小
哨兵模式:
redis會啟用一個進程監控redis主從庫,當redis主庫掛掉的時候,會對從庫進行選舉,選舉得分高的從庫,將變成主庫
當redis做關系型數據庫的緩存時,可能會出現下面問題,
緩存穿透:當用戶請求一個不存在的數據,請求會直接穿過redis,請求到rdb中,redis起不到緩存的作用,當請求很多時,數據庫壓力會變大
緩存擊穿:當redis中key存在,但是已經過期,大量並發請求也會直接穿透內存,請求到rdb,並緩存到redis,並發量很大時,后端數據庫,可能會被壓垮
緩存雪崩:當redis中大量key在同一時間段失效,或者服務重啟,也會給后端數據庫,帶來很大壓力
解決辦法:
1.對后端數據庫的請求,加鎖和隊列,保證即使雪崩出現,也不會把數據庫壓垮
2.將熱點數據的失效時間 分散開,在原有的失效時間上,再加上隨機數,保證不會有大量數據在同一時間段失效
3.熱點數據還可以設置成永不失效
4.異步更新,即及時緩存中不存在,也返回,另起一個線程定時更新緩存數據庫
5.使用過濾器,進行請求攔截,維護一個很大的隊列,保存有數據庫中所有可能存在的key,如果請求key不在隊列里,直接返回
6.緩存空數據,請求的key即使為空,也可以緩存到redis中,並設置適當的緩存時間
由於同步的存在,所以 后端數據庫和緩存數據庫,是不能保證一定一致的,如果業務需求要求強一致性需求的數據,那么就不能使用緩存