Redis 的緩存策略

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的Redis 6專欄,在這個系列專欄中我對B站黑馬的Redis教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛

💡Redis知識點速覽

  • 🍖 Redis緩存中間件
    • 🥩 緩存是什么
    • 🥩 Redis緩存已查詢數據
    • 🥩 redis緩存中間件實踐
  • 🍖 緩存更新
    • 🥩 緩存更新的三個策略
    • 🥩 主動更新策略的三種方案
    • 🥩 主動更新的代碼實現

🍖 Redis緩存中間件

🥩 緩存是什么

??所謂緩存就是數據交換的緩沖區(稱作Cache [ k?? ] ),是一個臨時存貯數據的地方,一般讀寫性能較高。CPU的運算速度要遠遠大于內存的讀寫速度,這樣會使CPU花費很長時間等待數據從內存的獲取或者寫入,因此緩存的出現主要就是為了解決CPU運算速度與內存讀寫速度不匹配的矛盾
??說了半天緩存和web開發有什么必要的聯系嘛?當然有,在整個web開發的各個階段都可以使用到不同緩存,比如瀏覽器緩存頁面等靜態資源,tomcat服務器應用層緩存查詢過的數據,數據庫緩存索引信息等在這里插入圖片描述緩存的優點

  • 降低后端負載
  • 提高讀寫效率,降低響應時間

緩存的缺點

  • 數據更新前后緩存區中該數據的一致性難保證
  • 解決數據一致性需要復雜的業務代碼,提高后續維護成本
  • 集群模式下提高運維成本

🥩 Redis緩存已查詢數據

??在未使用緩存之前,用戶的所有請求都會直接訪問數據庫,但是使用redis作為緩存之后就不一樣了。用戶的請求會是先在redis中查找,如果查到也就是命中的話就直接返回客戶端,如果未命中的話就去數據庫中查找,查到有結果就將查詢到的結果寫入redis中,然后返回給客戶端;未查到結果就返回404狀態碼在這里插入圖片描述

🥩 redis緩存中間件實踐

??黑馬點評中有這么一個業務:點擊商鋪圖片會通過id查詢該商鋪的相關信息,如果使用redis緩存的話,后期再訪問該商鋪的話就會直接到redis中查詢,可以大大縮短查詢所需時間

collector中定義與前端交互的方法,前端請求/shop-type/list?id=xx

@RestController
@RequestMapping("/shop")
public class ShopController {@Resourcepublic IShopService shopService;/*** 根據id查詢商鋪信息* @param id 商鋪id* @return 商鋪詳情數據*/@GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return shopService.queryById(id);}
}

編寫typeService里業務邏輯方法getList的接口和實現類,邏輯參考Redis緩存已查詢數據的相關分析

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result queryById(Long id) {// 從redis查詢商鋪緩存String shopJson = stringRedisTemplate.opsForValue().get(RedisConstants.CACHE_SHOP_KEY + id);// 判斷該商鋪是否存在if (StrUtil.isNotBlank(shopJson)) {// 存在直接返回Shop shop = JSONUtil.toBean(shopJson, Shop.class);return Result.ok(shop);}// 不存在查詢數據庫Shop shop = getById(id);if (shop == null) {// 數據庫中不存在直接返回錯誤信息return Result.fail("店鋪不存在");}// 數據庫中存在寫入redisstringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(shop));// 返回return Result.ok(shop);}
}

??經實驗驗證得知,使用redis緩存未命中時查詢耗時將近200毫秒,后續查詢命中之后只需幾毫秒,可見redis作為緩存中間件對數據讀取的功效還是很高的

🍖 緩存更新

??之前介紹redis的時候介紹過redis緩存的一些缺點,比如數據庫中數據更新前后緩存區中該數據的一致性難保證,該怎么應對redis緩存的這個缺點呢?這就引出接下來的學習內容——緩存更新策略

🥩 緩存更新的三個策略

??內存淘汰: redis底層的內存淘汰機制,無需我們自己維護,當內存不足時自動淘汰部分數據,下次查詢時更新緩存。這種機制的優點是維護成本極低,但是缺點也很明顯,由于淘汰數據的不確定性導致很難保證數據的一致性
??超時剔除: 向redis中添加緩存數據的時候設置TTL時間,到期后自動刪除緩存,下次查詢時更新緩存。這種機制維護成本不是很高,但是數據一致性同樣無法做到很高的保證,因為設置之后數據的有效期就固定了,但是更新時間不固定,若是數據在超時剔除之前發生更新然后查詢,得到的仍是更新之前的數據
??主動更新: 使用代碼在修改數據庫的同時更新緩存。這種策略能夠保證很高的數據一致性,但是伴隨而來的就是更高的維護成本,要在每一個更改語句后面加上redis緩存更新

??具體使用哪種策略取決于該業務對數據一致性的需求:一致性需求不高的話,可以使用內存淘汰策略。一致性需求較高的話,可以使用主動更新加上超時剔除策略,保證了較高的一致性
?

🥩 主動更新策略的三種方案

??代碼(Cache Aside Pattern):最直接的一種方案,使用代碼在修改數據庫的同時更新緩存
??服務(Read/Warite Through Pattern):將redis緩存與數據庫整合為一個服務,由這個服務來維護數據的一致性,在更新數據庫時只需要調用該服務即可,無需關心服務底層的業務邏輯,類似于封裝。但是市面上沒有現成的服務可以使用,自己封裝這么一個服務也很復雜,所以說這種方案可用性很差
??寫回(Write Behind Caching Pattern):所有數據庫的CRUD操作都在redis緩存中完成,由另外一個獨立的線程異步的將緩存中的數據持久化到數據庫中,以此來保證數據的最終一致。這種方案有個很大的好處,那就是極大地減少了對數據庫的操作,如果主線程在另一個線程兩次持久化之間對redis中的數據操作多次,數據庫中只會執行最后一次操作,而不是也操作多次。但是也有壞處,那就是如果還沒等到另一個線程持久化數據庫,此時redis緩存發生宕機,緩存大多數在內存中,此時發生宕機就會導致緩存中的數據消失,數據庫中的數據就與宕機前redis中的數據不一致

??綜上所述,雖然Cache Aside Pattern方案是最復雜的一個,但是他也同樣是最可靠的一個,于是我們選擇它來進行接下來的代碼學習

主動更新策略注意項
??數據庫發生更新的時候直接刪除緩存中的該數據,而不是跟著更新緩存,因為如果發生連續修改多次的情況,更新緩存的話更新次數等于數據庫的更新次數;如果是刪除緩存數據的話就只需要刪除一次,下一次查詢直接從數據庫中查詢再寫入緩存。
??刪除緩存數據和數據庫操作應該保證原子性,也就是說刪除緩存數據操作和數據庫操作應該同時成功或者同時失敗,那么該如何實現呢?單體式系統中,可以通過將兩個操作放在一個事務中來完成;分布式系統中可以利用TCC等分布式事務方案來實現
??刪除緩存數據操作和數據庫操作的先后順序是什么? 應該是先寫數據庫再刪除緩存,原因是這種方式發生線程安全性問題的可能較小

🥩 主動更新的代碼實現

controller層前端交互

/*** 更新商鋪信息* @param shop 商鋪數據* @return 無*/
@PutMapping
public Result updateShop(@RequestBody Shop shop) {// 寫入數據庫return shopService.update(shop);
}

??需要server的update方法,創建接口和實現類完成業務邏輯代碼編寫。主動更新+超時剔除的策略就只有兩步,那就是在寫緩存的時候設置超時時間,更新數據庫之后刪除緩存

// 數據庫中存在寫入redis的時候設置超時時間
stringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(shop), RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);/*** 更新商鋪信息* @param shop  商鋪信息* @return 前端返回數據*/
@Override
@Transactional
public Result update(Shop shop) {if (shop.getId() == null) {return Result.fail("店鋪id不能為空");}// 更新數據庫updateById(shop);// 刪除緩存stringRedisTemplate.delete(RedisConstants.CACHE_SHOP_KEY + shop.getId());// 返回return Result.ok();
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535022.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python顯示數據長度_python – 獲取CSV的長度以顯示進度

我正在處理大量CSV文件,每個文件都包含大量行.我的目標是逐行獲取數據并使用 Python將其寫入數據庫.但是,由于存在大量數據,我希望能夠跟蹤已寫入的數據量.為此,我計算了排隊的文件數量,并在每次文件完成時繼續添加一個文件. 我想為CSV文件做類似的事情并顯示我在哪一行,以及總…

關閉后天 樹莓派_陪你一起玩樹莓派-系統安裝

從今天就開始我們的樹莓派之旅&#xff0c;心情是不是有點小激動&#xff1f;我們拿到一個樹莓派是一個裸機。我們要準備一張16G的高速TF閃存卡&#xff0c;一個5V/2A的USB電源和一根micro B的 usb線。裝機步驟&#xff1a;一、下載樹莓派系統1、瀏覽器打開樹莓派官方網站 http…

簡單的簽到代碼_PHP實現一個小小的簽到功能,到底用MySQL還是Redis?

來源 | http://suo.im/5EWN3k今天&#xff0c;看下簽到功能怎么選擇&#xff1f;現在的網站和app開發中&#xff0c;簽到是一個很常見的功能&#xff0c;如微博簽到送積分&#xff0c;簽到排行榜~微博簽到如移動app &#xff0c;簽到送流量等活動&#xff0c;移動app簽到用戶簽…

【Redis 6】緩存穿透、緩存雪崩、緩存擊穿(附解決方案、代碼)

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的Redis 6專欄&#xff0c;在這個系列專欄中我對B站黑馬的Redis教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知識點速覽&#…

8軟件遇到的問題及解決方法_Excel工作表中的8個常見問題,你一定遇到過,附解決方法...

在Excel工作表中&#xff0c;最常用的還是一些技巧&#xff0c;如果能夠熟練掌握&#xff0c;對于工作效率的提高絕對不是一點點哦&#xff0c;結合工作實際&#xff0c;小編對工作中常見的問題進行了總結&#xff0c;一共有8類&#xff0c;你一定也遇到過……一、Excel工作表常…

unity著色器和屏幕特效開發秘笈_Oculus研發分享:開發移動VR內容時應避免的PC渲染技術...

查看引用/信息源請點擊&#xff1a;映維網開發移動VR內容時應避免的PC渲染技術&#xff08;映維網 2019年11月25日&#xff09;有不少開發者都是以與PC相同的方式來開發Quest游戲&#xff0c;但這可能會導致優化性能方面出現大量困難。Oculus軟件工程師特雷弗達什&#xff08;T…

Java包裝類、java中的方法傳參機制:按值調用

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 方法…

尤克里里怎么樣_尤克里里和吉他區別?尤克里里與吉他相比有什么不可替代的優勢...

尤克里里和吉他有什么區別&#xff1f;想必大家都見過尤克里里吧&#xff0c;就是類似吉他形狀的一種小型弦撥樂器。我們可以簡單的認為&#xff1a;尤克里里是簡化版本的吉他&#xff0c;更加簡單&#xff0c;更加便宜。小編彈的就是尤克里里2.從外觀上&#xff1a;吉他很大&a…

餓漢懶漢單例設計模式的使用及區別、java中的import關鍵字

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

廣電運通不好進嗎_我可以說鄭州新風的安裝大部分都是垃圾嗎?

說鄭州的新風安裝都是垃圾&#xff0c;這話很無禮&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能說確實是這樣嘛&#xff1f;其實包括我以前安裝的也不合格——雖然我不是故意的。這幾年見過許多家同行安裝的新風&#xff0c;可以說目前見到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

atlas安裝需要kafka嗎_Atlas 2.1.0 實踐(2)—— 安裝Atlas

在完成Atlas編譯以后&#xff0c;就可以進行Atlas的安裝了。Atlas的安裝主要是安裝Atlas的Server端&#xff0c;也就Atlas的管理頁面&#xff0c;并確保Atlas與Kafka Hbase Solr等組件的集成。Atlas的系統架構如下&#xff0c;在確保 底層在完成Atlas編譯以后&#xff0c;就可以…

ue4中隱藏燈光和相機圖標_[HDRP]物理燈光是什么?科普向

HDRP拋棄了Bulitin的燈光&#xff0c;改用物理單位以及物理屬性。那么物理燈光到底是什么&#xff1f;請點贊評論來支持作者&#xff0c;提前祝大家新年快樂。https://connect.unity.com/p/hdrp-wu-li-deng-guang-shi-shi-yao-ke-pu-xiang?connect.unity.com同步更新unity con…

私鑰經過哈希計算可以產生公鑰_「區塊鏈基礎概念100」:公鑰和私鑰 | 027

免責聲明&#xff1a;本文旨在傳遞更多市場信息&#xff0c;不構成任何投資建議。文章僅代表作者觀點&#xff0c;不代表火星財經官方立場。小編&#xff1a;記得關注哦投資區塊鏈&#xff0c;猛戳&#xff1a;火星財經App下載來源&#xff1a;學習區塊鏈原文標題&#xff1a;「…

關于List集合類ArrayList、LinkedList、Vector詳解

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

1562a檢測軟件_洛達1562a空間音頻版評測!!!

哈嘍大家好&#xff01;這里是小澤&#xff0c;一個不專業的Beatboxer~~~今天給大家帶來一期HQB最新空間音頻版洛達1562a耳機的評測視頻&#xff0c;建議先贊再看&#xff01;&#xff08;滑稽&#xff09;聽說你不點贊&#xff1f;昨晚拍了一晚&#xff0c;但是因為是第一次搞…

python 趣味編程課_青少年編程:Python趣味編程基礎入門課程

課程目錄 章節1:編程課前說明試看 課時1 編程課前說明07:49可試看 章節2:第一章 Python基礎-認識環境試看 課時2 1、什么是計算機程序和編程&#xff1f;08:48可試看 課時3 2、為什么學習編程&#xff1f;03:10可試看 課時4 3、Python的安裝11:48可試看 課時5 4、用Python編寫第…

shell181網格劃分_ANSYS中Shell181單元介紹誰知道

再畢業設計做模型中要應用到SHELL181單元&#xff0c;那么這個單元有什么好處誰能具體的告訴我下&#xff0c;我有英文但是有的地方翻譯不通。或者誰能幫我翻譯一下~謝謝~SHELL181issuitableforanalyzingth...再畢業設計做模型中要應用到SHELL181單元&#xff0c;那么這個單元有…

關于Set集合類你都知道什么?來自《卷Ⅰ》的靈魂提問

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄&#xff0c;在這個系列專欄中我將記錄淺學這本書所得收獲&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波簡直就是血賺 &#x1f4a1;涉及的知識點速通&#x1f6eb; 關于…

流程圖虛線框表示什么_UI設計|APP的交互線框布局設計

一.流程圖設計流程圖(Flow Chart)&#xff1a;用圖示的方式反映出特定主體為了滿足特定需求而進行的有特定邏輯關系的一系列操作過程。流程圖的四種基本結構&#xff1a;順序結構&#xff0c;條件結構(又稱選擇結構)&#xff0c;循環結構&#xff0c;分支結構。1.流程圖的常用符…