吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

先操作數據庫還是先操作緩存?

數據分析與開發 ? 來源:數據分析與開發 ? 作者:撿田螺的小男孩 ? 2020-10-30 11:09 ? 次閱讀

來源:撿田螺的小男孩

前言

在分布式系統中,緩存和數據庫同時存在時,如果有寫操作,先操作數據庫還是先操作緩存呢?本文將分5種方案展開闡述對比,謝謝閱讀~

緩存維護方案一

如果是一讀(線程B)一寫(線程A)操作,「先操作緩存,再操作數據庫」。流程圖如下所示:

1.線程A發起一個寫操作,第一步del cache

2.線程A第二步寫入新數據到DB

3.線程B發起一個讀操作,cache miss緩存失效了。

4.線程B從DB獲取最新數據

5.線程B執行set cache,把從DB讀到的數據,更新到緩存。

「這樣看,沒啥問題」。我們再看第二個流程圖,如下:

1.線程A發起一個寫操作,第一步del cache

2.此時線程B發起一個讀操作,cache miss

3.線程B繼續讀DB,讀出來一個老數據

4.然后老數據設置入cache

5.線程A寫入DB最新的數據

OK,醬紫,就有問題了吧,老數據入到緩存了,「每次讀都是老數據啦,緩存與數據與數據庫數據不一致了」。

緩存維護方案二

上個方案是一讀一寫,如果是雙寫操作,「先操作緩存,在操作數據庫」,會怎么樣呢?

1.線程A發起一個寫操作,第一步set cache

2.線程A第二步寫入新數據到DB

3.線程B發起一個寫操作,set cache

4.線程B第二步寫入新數據到DB

「這樣看,也沒啥問題。」,但是有時候可能事與愿違,我們再看第二個流程圖,如下:

1.線程A發起一個寫操作,第一步set cache

2.線程B發起一個寫操作,第一步set cache

3.線程B寫入數據庫到DB

4.線程A寫入數據庫到DB

執行完后,緩存保存的是B操作后的數據,數據庫是A操作后的數據,「緩存和數據庫數據不一致了」。

緩存維護方案三

一寫(線程A)一讀(線程B)操作,「先操作數據庫,再操作緩存」。

1.線程A發起一個寫操作,第一步write DB

2.線程A第二步del cache

3.線程B發起一個讀操作,cache miss

4.線程B從DB獲取最新數據

5.線程B同時set cache

有些朋友可能認為,在第2步刪除緩存之前,線程B讀過來呢?這時候,讀到的是緩存老數據,這個可以認為是正常業務邏輯呀,下次再讀取就是正確數據了。

這種方案「沒有明顯的并發問題」,但是呢,「步驟二刪除緩存失敗」,還是個問題。不過概率比較小,「優于方案一和方案二」,平時工作中也是使用方案三。

綜上對比,我們一般采用方案三,但是有沒有完美全解決方案三的弊端的方法呢?

緩存維護方案四

這個是方案三的改進方案,都是先操作數據庫再操作緩存,我們來看一下流程圖:

通過數據庫的「binlog」來「異步淘汰key」,以mysql為例 可以「使用阿里的canal將binlog日志采集發送到MQ隊列」里面,然后「通過ACK機制 確認處理」這條更新消息,刪除緩存,保證數據緩存一致性。

但是呢還有個問題,「如果是主從數據庫呢」?

緩存維護方案五

主從DB問題:因為主從DB同步存在延時時間。如果刪除緩存之后,數據同步到備庫之前已經有請求過來時,「會從備庫中讀到臟數據」,如何解決呢?解決方案如下流程圖:

緩存維護總結

綜上所述,在分布式系統中,緩存和數據庫同時存在時,如果有寫操作的時候,「先操作數據庫,再操作緩存」。如下:

1.讀取緩存中是否有相關數據

2.如果緩存中有相關數據value,則返回

3.如果緩存中沒有相關數據,則從數據庫讀取相關數據放入緩存中key->value,再返回

4.如果有更新寫數據,則先操作數據庫,再操作緩存

5.為了保證第四步更新緩存成功,使用binlog異步通知操作

6.如果是主從數據庫,binglog取自于從庫

7.如果是一主多從,每個從庫都要采集binlog,然后消費端收到最后一臺binlog數據才刪除緩存

原文標題:并發環境下,先操作數據庫還是先操作緩存?

文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 緩存
    +關注

    關注

    1

    文章

    241

    瀏覽量

    26759
  • 數據庫
    +關注

    關注

    7

    文章

    3848

    瀏覽量

    64690

原文標題:并發環境下,先操作數據庫還是先操作緩存?

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    避坑指南:云服務器數據庫購買方法全攻略

    云服務器數據庫購買方法包含:明確業務需求與數據庫類型,再挑選信譽好、技術支持強的云服務提供商,接著根據需求配置數據庫實例及選擇付費方式。購買后,通過云管理平臺訪問管理
    的頭像 發表于 01-15 10:05 ?77次閱讀

    SqlServer數據恢復—SqlServer數據庫數據恢復案例

    一塊硬盤上存放的SqlServer數據庫,windows server操作系統+NTFS文件系統。由于誤操作導致分區損壞,需要恢復硬盤里的SqlServer數據庫
    的頭像 發表于 01-09 11:15 ?92次閱讀
    SqlServer<b class='flag-5'>數據</b>恢復—SqlServer<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例

    數據庫是哪種數據庫類型?

    數據庫是一種部署在虛擬計算環境中的數據庫,它融合了云計算的彈性和可擴展性,為用戶提供高效、靈活的數據庫服務。云數據庫主要分為兩大類:關系型數據庫
    的頭像 發表于 01-07 10:22 ?142次閱讀

    數據庫事件觸發的設置和應用

    數據庫無論對于生產管理還是很多的實際應用都非常重要。小編這次聊一下數據庫事件觸發的應用。示例使用了postgresql和Python。
    的頭像 發表于 12-13 15:14 ?220次閱讀

    云托管可以操作數據庫嗎?安全性如何

    云托管可以操作數據庫。在云托管環境中,開發者可以通過使用云服務提供商提供的API或SDK來連接并操作數據庫。云托管提供了多種安全性措施來保護數據
    的頭像 發表于 12-11 13:35 ?124次閱讀

    數據庫數據恢復—MYSQL數據庫ibdata1文件損壞的數據恢復案例

    mysql數據庫故障: mysql數據庫文件ibdata1、MYI、MYD損壞。 故障表現:1、數據庫無法進行查詢等操作;2、使用mysqlcheck和myisamchk無法修復
    的頭像 發表于 12-09 11:05 ?224次閱讀

    數據庫數據恢復—通過拼接數據庫碎片恢復SQLserver數據庫

    一個運行在存儲上的SQLServer數據庫,有1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,數據庫
    的頭像 發表于 10-31 13:21 ?337次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—通過拼接<b class='flag-5'>數據庫</b>碎片恢復SQLserver<b class='flag-5'>數據庫</b>

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫
    的頭像 發表于 09-20 11:46 ?410次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—SQL Server<b class='flag-5'>數據庫</b>出現823錯誤的<b class='flag-5'>數據</b>恢復案例

    華納云:MySQL初始化操作如何創建新的數據庫

    要在MySQL中創建一個新的數據庫,可以按照以下步驟進行操作: 登錄到MySQL數據庫管理系統中。可以使用MySQL命令行客戶端或者圖形化工具,如phpMyAdmin。 使用CREATE
    的頭像 發表于 09-04 14:30 ?315次閱讀

    數據庫數據恢復—SQL Server數據庫所在分區空間不足報錯的數據恢復案例

    SQL Server數據庫數據恢復環境: 某品牌服務器存儲中有兩組raid5磁盤陣列。操作系統層面跑著SQL Server數據庫,SQL Server
    的頭像 發表于 07-10 13:54 ?579次閱讀

    對于中斷,執行中斷服務函數還是清理中斷標志?

    對于中斷,執行中斷服務函數還是清理中斷標志?開始學習固件的時候,差不多是先進入服務函數在清理中斷標志。最近在用CubeMX,是清理中
    發表于 05-22 07:20

    數據庫數據恢復—raid5陣列上層Sql Server數據庫數據恢復案例

    數據庫數據恢復環境: 5塊硬盤組建一組RAID5陣列,劃分LUN供windows系統服務器使用。windows系統服務器內運行了Sql Server數據庫,存儲空間在操作系統層面劃分
    的頭像 發表于 05-08 11:43 ?579次閱讀
    <b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復—raid5陣列上層Sql Server<b class='flag-5'>數據庫</b><b class='flag-5'>數據</b>恢復案例

    MongoDB數據恢復—MongoDB數據庫文件損壞的數據恢復案例

    服務器數據恢復環境: 一臺Windows Server操作系統服務器,服務器上部署MongoDB數據庫。 MongoDB數據庫故障&檢測: 工作人員在未關閉MongoDB
    的頭像 發表于 04-23 14:48 ?458次閱讀
    MongoDB<b class='flag-5'>數據</b>恢復—MongoDB<b class='flag-5'>數據庫</b>文件損壞的<b class='flag-5'>數據</b>恢復案例

    選擇 KV 數據庫最重要的是什么?

    經常有客戶提到 KV 數據庫,但卻偏偏“不要 Redis”。比如有個做安全威脅分析平臺的客戶,他們明確表示自己對可靠性要求非常高,需要的不是開源 Redis 這種內存緩存,而是 KV 數據庫
    的頭像 發表于 03-28 22:11 ?745次閱讀
    選擇 KV <b class='flag-5'>數據庫</b>最重要的是什么?

    ?通過Modbus讀寫數據庫中的數據

    狀態通過‘$RDSS()’方法寫入到Modbus緩存(狀態大于0時正常執行查詢),上位機通過Modbus協議即可讀取到數據庫數據以及查詢結果。 第3組是從智能網關的Modbus緩存
    發表于 03-14 13:44
    百家乐总厂在哪里| 鲨鱼百家乐游戏平台| 真人百家乐澳门娱乐城| 二八杠游戏下载| 望江县| 广发百家乐官网的玩法技巧和规则 | 百家乐视频游戏挖坑| 大发888 充值淘宝| A8百家乐官网娱乐城| 真人百家乐信誉| 大发888游戏平台 娱乐场下载| 百家乐官网娱乐城游戏| 美国百家乐怎么玩| 大发888真坑阿| 百家乐官网娱乐软件| 百家乐庄闲筹码| 网上大发扑克| 百家乐官网英皇娱乐网| 九州百家乐的玩法技巧和规则| 百家乐官网技巧运气| 百家乐玩法及技巧| 德州扑克和梭哈| 百家乐官网b28博你| 澳门百家乐经| 百家乐官网二游戏机| 百家乐桌子豪华| 丹棱县| 百家乐视频游戏挖坑| 365新网址| 做生意佩戴什么纳财| 大发888bet下载| 百家乐官网打格式| 大发888最新信息| 百家乐官网真人游戏棋牌| 威尼斯人娱乐城老牌| 百家乐官网扫描技术| 大发888博彩娱乐城| 百家乐官网投住系统| 百家乐游戏什么时间容易出| 赌博中百家乐官网什么意思| 哪家百家乐优惠最好且信誉不错|