1.緩存穿透
是指在緩存未找到數據的時候去查詢數據庫的機制作用下,若流量大的時候砸到數據庫上導致數據庫掛掉。
2.緩存雪崩
是指緩存的過期時間設在同一時間,若特定時間全部過期,則導致請求全部砸到數據庫上,導致數據庫掛掉。
3.緩存擊穿
是指某個熱點Key 剛好失效,還沒來得loadDb的間隔期 數據庫已經掛掉。
如下使用redis.setnx(互斥)去loadDB,成功了返回,不成功延時重試下。
public String get(key) { String value = redis.get(key); if (value == null) { //代表緩存值過期 //設置3min的超時,防止del操作失敗的時候,下次緩存過期一直不能load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //SET if Not eXists 不存在的時候 才設置 代表設置成功 value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); } else { //這個時候代表同時候的其他線程已經load db並回設到緩存了,這時候重試獲取緩存值即可 sleep(50); get(key); //重試 } } else { return value; } }