????歡迎光臨,終于等到你啦????
??我是蘇澤,一位對技術(shù)充滿熱情的探索者和分享者。????
??持續(xù)更新的專欄Redis實戰(zhàn)與進階
本專欄講解Redis從原理到實踐
這是蘇澤的個人主頁可以看到我其他的內(nèi)容哦????
努力的蘇澤http://suzee.blog.csdn.net/
?文章來源地址http://www.zghlxwxcb.cn/news/detail-843041.html
緩存如何實現(xiàn)?面試必考題? 請看 我的講解以及最佳實踐吧
目錄
緩存如何實現(xiàn)?面試必考題? 請看 我的講解以及最佳實踐吧
關(guān)于 Redis 緩存的解釋如下:
實現(xiàn)思路圖
商戶緩存跟著視頻做的,然后我按照同樣的方法邏輯 把商店類型的緩存自己做了一遍
首先注冊一個IShopTypeService服務(wù)的對象typeService 然后直接調(diào)用typeService的方法queryTypeList()
?文章來源:http://www.zghlxwxcb.cn/news/detail-843041.html
下一節(jié)我們來講解 Redis緩存擊穿 緩存雪崩等緩存更新會發(fā)生的問題? 都是Redis的面試必考題
?
關(guān)于 Redis 緩存的解釋如下:
- Redis 如何實現(xiàn)緩存?
在后端接收到請求后,對于需要進行緩存的接口,首先會在 Redis 中查找是否有對應的數(shù)據(jù)。如果緩存中不存在數(shù)據(jù),系統(tǒng)會繼續(xù)按照正常的業(yè)務(wù)流程處理請求,并將查詢到的結(jié)果返回給客戶端的同時也存儲在 Redis 中。下次相同的請求到達時,系統(tǒng)可以直接從 Redis 中獲取數(shù)據(jù),而無需訪問數(shù)據(jù)庫。
在啟用緩存后,相同的請求在緩存有效期內(nèi)不會再去讀取數(shù)據(jù)庫。但是,如果在此期間修改了數(shù)據(jù)庫中的數(shù)據(jù),接口返回的數(shù)據(jù)就無法保證與數(shù)據(jù)庫一致。因此,在進行增、刪、改操作時,需要刷新緩存。
- Redis 緩存更新策略是什么?
緩存更新可以采用不同的策略,以下是兩種常見情況的比較:
第一種情況是先更新數(shù)據(jù)庫,然后同步更新緩存,或者先更新緩存,然后同步更新數(shù)據(jù)庫。這兩種方式都屬于寫穿透(write through)策略。同步更新的好處是可以保持數(shù)據(jù)的一致性,但缺點是同步更新會對性能產(chǎn)生影響。
第二種情況是先更新緩存,然后異步寫回數(shù)據(jù)庫,也被稱為寫回(write back)策略。異步寫回的優(yōu)點是不會影響緩存的高性能,能夠快速響應客戶端請求。但缺點是在數(shù)據(jù)異步寫回數(shù)據(jù)庫之前,緩存與數(shù)據(jù)庫的數(shù)據(jù)可能短暫不一致。
實現(xiàn)思路圖
?
商戶緩存跟著視頻做的,然后我按照同樣的方法邏輯 把商店類型的緩存自己做了一遍
以下是步驟
首先注冊一個IShopTypeService服務(wù)的對象typeService 然后直接調(diào)用typeService的方法queryTypeList()
@RestController
@RequestMapping("/shop-type")
public class ShopTypeController {
@Resource
private IShopTypeService typeService;
@GetMapping("list")
public Result queryTypeList() {
// List<ShopType> typeList = typeService.query().orderByAsc("sort").list();
return typeService.queryTypeList();
}
}
在IShopTypeService接口中我們定義這個抽象方法 然后在IShopTypeService的實現(xiàn)類IShopTypeServiceImp中實現(xiàn)這個方法
public interface IShopTypeService extends IService<ShopType> {
Result queryTypeList();
}
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource//引入mybatis的接口 用于查數(shù)據(jù)庫
private IShopTypeService shopTypeService;
@Override
public Result queryTypeList() {
//1.從redis中查詢有無
String shopTypeJson = stringRedisTemplate.opsForValue().get("shopType");
//2.判斷是否存在
if (StrUtil.isNotBlank(shopTypeJson)){
//3.存在直接返回 JSONUtil.parseArray將JSON 數(shù)組字符串轉(zhuǎn)換為 Java 對象列表
List<ShopType> shopType= BeanUtil.copyToList(JSONUtil.parseArray(shopTypeJson), ShopType.class);
// System.err.println(shopType);
return Result.ok(shopType);
}
//不存在 查詢數(shù)據(jù)庫
List<ShopType> shopTypeList = shopTypeService.query().orderByAsc("sort").list();
//數(shù)據(jù)庫不存在 返回報錯
if (shopTypeList ==null) {
return Result.fail("查詢失敗");
}
//數(shù)據(jù)庫存在 寫入redis 返回
//將list轉(zhuǎn)換成json 要用toJsonStr不能toString
String str = JSONUtil.toJsonStr(shopTypeList);
stringRedisTemplate.opsForValue().set("shopType",str);
// System.err.println(str);
return Result.ok(shopTypeList);
}
}
- 首先,從 Redis 中查詢數(shù)據(jù)是否存在。
- 如果數(shù)據(jù)存在,將 JSON 數(shù)組字符串轉(zhuǎn)換為?
List<ShopType>
?對象,并直接返回結(jié)果。 - 如果數(shù)據(jù)不存在于 Redis 中,則從數(shù)據(jù)庫查詢商店類型列表。
- 如果數(shù)據(jù)庫查詢失敗,返回查詢失敗的錯誤信息。
- 如果數(shù)據(jù)庫查詢成功,將查詢結(jié)果轉(zhuǎn)換為 JSON 字符串,并存儲到 Redis 中。
- 最后,返回查詢結(jié)果。
?
下一節(jié)我們來講解 Redis緩存擊穿 緩存雪崩等緩存更新會發(fā)生的問題? 都是Redis的面試必考題
?
?
?
到了這里,關(guān)于Springboot+Redis:實現(xiàn)緩存 減少對數(shù)據(jù)庫的壓力的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!