@Override
public Result queryById(Long id) {
//從redis中查詢商鋪緩存
String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
//判斷緩存是否命中
if (StrUtil.isNotBlank(shopJson)){
//命中,則返回店鋪信息
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
//未命中,根據(jù)id查詢數(shù)據(jù)庫
Shop shop = getById(id);
//不存在該店鋪,報錯
if (shop==null){
return Result.fail("店鋪不存在!");
}
//存在,寫入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY+id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
//返回
return Result.ok(shop);
}
緩存更新策略緩存穿透?緩存穿透是指客戶端請求的數(shù)據(jù)在緩存中和數(shù)據(jù)庫中都不存在,這樣緩存永遠不會生效,這些請求都會打到數(shù)據(jù)庫(一些別有用心的人就會利用這一點不斷的發(fā)出這樣的請求,導(dǎo)致服務(wù)器壓力變大)。
常見的兩種解決方案: 緩存空對象*優(yōu)點:實現(xiàn)簡單,維護方便
*缺點:1.額外的內(nèi)存消耗. 2.可能存在數(shù)據(jù)短期的不一致。
布隆過濾優(yōu)點:內(nèi)存占用較少。沒有多余的key。
缺點:1.實現(xiàn)復(fù)雜 2.存在誤判的可能。
布隆過濾器可以簡單的理解為:是一個bite數(shù)組,里面存的是二進制位,不是把數(shù)據(jù)庫里面的數(shù)據(jù)存儲到布隆過濾器里面,而是把這些數(shù)據(jù)基于某種Hash算法計算出Hash值,然后再將這些Hash值轉(zhuǎn)換成二進位保存到布隆過濾器里面,當我們要去判斷數(shù)據(jù)庫里面的數(shù)據(jù)是否存在的時候,其實就是判斷對應(yīng)的位置是0還是1.
基于redis緩存查詢店鋪考慮緩存穿透問題@Override
public Result queryById(Long id) {
//從redis中查詢商鋪緩存
String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);
//判斷緩存是否命中
if (StrUtil.isNotBlank(shopJson)){
//命中,則返回店鋪信息
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
//命中為"",說明在數(shù)據(jù)庫中店鋪不存在
if (shopJson !=null){
return Result.fail("店鋪不存在!");
}
//未命中,根據(jù)id查詢數(shù)據(jù)庫
Shop shop = getById(id);
//不存在該店鋪,報錯
if (shop==null){
//將空值寫入redis中
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY +id,"",CACHE_NULL_TTL,TimeUnit.MINUTES);
return Result.fail("店鋪不存在!");
}
//存在,寫入redis
stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY+id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
//返回
return Result.ok(shop);
}
緩存雪崩緩存雪崩是指在同一時段大量的緩存key同時失效或者Redis服務(wù)宕機,導(dǎo)致大量請求到達數(shù)據(jù)庫,帶來巨大的壓力。
解決方案1.由于大量的緩存同時失效,造成原因可能就是TTL時間到了。所以:給不同的Key的TTL添加隨機值。
2.針對redis宕機:搭建redis集群形成主從,假設(shè)主宕機了,我們就可以從 從機替代,這樣就可以確保redis可以一直對外提供服務(wù)。
3.給緩存業(yè)務(wù)添加降級限流策略
4.給業(yè)務(wù)添加多級緩存
緩存擊穿緩存擊穿問題也叫熱點Key問題,就是一個被高并發(fā)訪問并且緩存重建業(yè)務(wù)較復(fù)雜的key突然失效了,無數(shù)的請求訪問會在瞬間給數(shù)據(jù)庫帶來巨大的沖擊。
假設(shè):一個熱點key失效了,當線程1來了,發(fā)現(xiàn)沒有緩存,就會去重建緩存,這個過程又比較久,在重建的過程中仍然有許多的請求。
常見的兩種解決方案: ? 1.互斥鎖缺點:性能比較差。因為在構(gòu)建緩存的過程中,其他的線程都要等待。
2.邏輯過期?也就是在緩存中多了一個邏輯過期時間。而沒有真的去設(shè)置TTL過期時間。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧