色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    240

    瀏覽量

    26701
  • 數據庫
    +關注

    關注

    7

    文章

    3827

    瀏覽量

    64514

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

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

    一個運行在存儲上的SQLServer數據庫,有1000多個文件,大小幾十TB。數據庫每10天生成一個NDF文件,每個NDF幾百GB大小。數據庫包含兩個LDF文件。 存儲損壞,數據庫
    的頭像 發表于 10-31 13:21 ?268次閱讀
    <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 ?373次閱讀
    <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 ?280次閱讀

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

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

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

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

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

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

    HarmonyOS開發案例:【關系型數據庫

    使用關系型數據庫的相關接口實現了對賬單的增、刪、改、查操作
    的頭像 發表于 04-22 14:58 ?669次閱讀
    HarmonyOS開發案例:【關系型<b class='flag-5'>數據庫</b>】

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

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

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

    狀態通過‘$RDSS()’方法寫入到Modbus緩存(狀態大于0時正常執行查詢),上位機通過Modbus協議即可讀取到數據庫數據以及查詢結果。 第3組是從智能網關的Modbus緩存
    發表于 03-14 13:44
    主站蜘蛛池模板: 99精品视频免费观看| 伊人久久大香线蕉影院95| 97精品国产亚洲AV高清| 999国产高清在线精品| 国内精品一级毛片免费看| 色翁荡熄月月| 夜夜艹日日干| 国产亚洲精品久久7777777| 天天久久影视色香综合网| 白嫩美女直冒白浆| 日本工口生肉全彩大全| www伊人网| 日本中文一区| 成人性生交大片| 射漂亮黑b丝女| 国产精品热久久高潮AV袁孑怡| 手机在线免费观看毛片| 国产精品第九页| 性做久久久久免费观看| 果冻传媒剧情在线观看| 伊人影院综合在线| 乱亲女H秽乱长久久久| 999精品国产人妻无码系列| 欧美乱子YELLOWVIDEO| 成人综合在线观看| 午夜免费小视频| 果冻传媒在线观看进入窗口 | 让人爽到湿的小黄书| 超碰在线97av视频免费| 添加一点爱与你电视剧免费观看| 国产精品无码久久av| 亚洲欧洲精品A片久久99| 久久综合网久久综合| yellow在线观看免费高清的日本| 视频成人永久免费看| 好湿好滑好硬好爽好深视频| 色尼玛亚洲| 国产九色在线| 一本色道久久88加勒比—综合| 免费看男人J放进女人J无遮掩| 东北女人奶大毛多水多|