1、什麼是緩存穿透?
緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數據庫。
2、常見的解決緩存穿透有哪些方法
(1)緩存空對象
優點:實現簡單,維護方便
缺點:額外的内存消耗,和可能造成短期的不一緻
針對缺點内存消耗我們可以設置key的過期時間,針對于短期不一緻性,我們可以在更新數據庫的同時更新緩存;
(1)布隆過濾器
對于布隆過濾器的實現,我們放在後面的章節中講解;
3、代碼實現緩存空對象,解決緩存穿透現象:
public <R,ID> R queryWithPassThrough(
String keyPrefix, ID id, Class<R> type, Function<ID, R> dbFallback, Long time, TimeUnit unit){
String key = keyPrefix id;
// 1.從redis查詢商鋪緩存
String JSON = stringRedisTemplate.opsForValue().get(key);
// 2.判斷是否存在
if (StrUtil.isNotBlank(json)) {
// 3.存在,直接返回
return JSONUtil.toBean(json, type);
}
// 判斷命中的是否是空值
if (json != null) {
// 返回一個錯誤信息
return null;
}
// 4.不存在,根據id查詢數據庫
R r = dbFallback.apply(id);
// 5.不存在,返回錯誤
if (r == null) {
// 将空值寫入redis
stringRedisTemplate.opsForValue().set(key, "", CACHE_NULL_TTL, TimeUnit.MINUTES);
// 返回錯誤信息
return null;
}
// 6.存在,寫入redis
this.set(key, r, time, unit);
return r;
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!