最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過(guò)緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢

 更新時(shí)間:2023年04月07日 08:16:47   作者:Robinbin  
本文通過(guò)介紹緩存的基本原理和SQL語(yǔ)句的優(yōu)化手段,以及實(shí)際案例的分析,為讀者提供了一種簡(jiǎn)單而有效的優(yōu)化思路。讀者可以通過(guò)本文了解到如何在不修改程序代碼的情況下,通過(guò)巧妙地運(yùn)用緩存和SQL優(yōu)化技巧,提高程序的性能和響應(yīng)速度。

問(wèn)題描述

單例數(shù)據(jù)庫(kù)模式中,后端高并發(fā)請(qǐng)求多(讀多寫少),導(dǎo)致數(shù)據(jù)庫(kù)壓力過(guò)大,關(guān)鍵接口響應(yīng)變慢,嚴(yán)重影響體驗(yàn)。

需求

減少接口的響應(yīng)時(shí)間。

尋找解決方案

由于問(wèn)題主要處在數(shù)據(jù)庫(kù)壓力過(guò)大的情況,采用兩種優(yōu)化思路優(yōu)化查詢過(guò)程:

  • 使用緩存分擔(dān)數(shù)據(jù)庫(kù)壓力
  • 對(duì)查詢數(shù)據(jù)庫(kù)過(guò)程做優(yōu)化

緩存方案

更新策略

使用Redis,雖然可以很好地減少數(shù)據(jù)庫(kù)的壓力,但是同時(shí)在高并發(fā)的情況下,容易出現(xiàn)數(shù)據(jù)不一致的情況,尤其是在更新數(shù)據(jù)的時(shí)候。

最常見的導(dǎo)致不一致的原因是雙寫操作,即高并發(fā)情況下短時(shí)間內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行兩次寫操作。為了最小程度地出現(xiàn)這種情況,緩存在更新策略上采用先更新數(shù)據(jù)庫(kù)后刪除緩存的方式。

對(duì)于雙寫問(wèn)題,在最壞情況下,寫請(qǐng)求A在更新數(shù)據(jù)庫(kù)后,被寫請(qǐng)求B先一步更新數(shù)據(jù)庫(kù)+刪除緩存,然后A請(qǐng)求才刪除緩存,也不會(huì)導(dǎo)致后續(xù)請(qǐng)求讀取到錯(cuò)誤的值。

對(duì)于先寫后讀,在最壞情況下,寫請(qǐng)求A在更新數(shù)據(jù)庫(kù)后,被讀請(qǐng)求C先一步在緩存讀取到舊值,然后A請(qǐng)求才刪除緩存,也只會(huì)影響這段時(shí)間的讀請(qǐng)求,刪除后的讀請(qǐng)求不影響。

對(duì)比其他方案(先更新緩存后更新數(shù)據(jù)庫(kù)、先刪除緩存后更新數(shù)據(jù)庫(kù)、先更新數(shù)據(jù)庫(kù)后更新緩存)在最壞情況下會(huì)導(dǎo)致的錯(cuò)誤(更新數(shù)據(jù)庫(kù)失敗導(dǎo)致緩存是未知值、雙寫后數(shù)據(jù)庫(kù)變成舊值、更新緩存失敗導(dǎo)致緩存保存舊值)要好得多。

但是先更新數(shù)據(jù)庫(kù)后刪除緩存也不是完全安全的,除了上文提到的高并發(fā)下先寫后讀可能讀到舊值外,若刪除緩存失敗,也有可能導(dǎo)致讀到舊值。處理方法見下文。

緩存架構(gòu)

添加緩存,勢(shì)必要修改業(yè)務(wù)代碼,如何配置架構(gòu)才能把對(duì)代碼的入侵性講到最低,這里使用監(jiān)聽數(shù)據(jù)庫(kù)binlog的方法,使用中間件監(jiān)聽mysql的日志,當(dāng)出現(xiàn)操作時(shí),通知專門的模塊來(lái)修改緩存,做到修改緩存和業(yè)務(wù)邏輯解耦。

同時(shí)為了解決緩存刪除失敗的問(wèn)題,當(dāng)發(fā)生失敗時(shí),發(fā)送消息至消息隊(duì)列傳遞給專門的模塊進(jìn)行重試刪除。

中間件選擇:

  • 緩存使用Redis
  • 監(jiān)聽binlog使用canal
  • 消息隊(duì)列使用RocketMQ

架構(gòu)如下所示:

SQL優(yōu)化

查詢優(yōu)化可以從兩個(gè)方面進(jìn)行:

  • 根據(jù)高頻的查詢case,遵循最左匹配原則,設(shè)置對(duì)應(yīng)的索引或聯(lián)合索引
  • 通過(guò)了解業(yè)務(wù)場(chǎng)景,看看能否將一些小SQL合并成大SQL

通過(guò)本文的介紹,我們可以看到,優(yōu)化慢查詢并不一定需要對(duì)程序代碼進(jìn)行復(fù)雜的修改。通過(guò)巧妙地運(yùn)用緩存和SQL優(yōu)化手段,我們可以達(dá)到相同或者更好的效果。在實(shí)際的開發(fā)中,我們應(yīng)該繼續(xù)探索和研究這些優(yōu)化方法,以提高程序的效率和穩(wěn)定性。

到此這篇關(guān)于通過(guò)緩存+SQL修改優(yōu)雅地優(yōu)化慢查詢的文章就介紹到這了,更多相關(guān)優(yōu)化慢查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建數(shù)據(jù)表

    MySQL創(chuàng)建數(shù)據(jù)庫(kù)和創(chuàng)建數(shù)據(jù)表

    MySQL?是最常用的數(shù)據(jù)庫(kù),在數(shù)據(jù)庫(kù)操作中,基本都是增刪改查操作,簡(jiǎn)稱CRUD。但是,這篇文章主要介紹了數(shù)據(jù)庫(kù)和數(shù)據(jù)表如何創(chuàng)建,想詳細(xì)了解的小伙伴可以參考閱讀一下
    2023-03-03
  • java連不上mysql8.0問(wèn)題的解決方法

    java連不上mysql8.0問(wèn)題的解決方法

    這篇文章主要為大家詳細(xì)介紹了java連不上MySQL8.0問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • MySQL數(shù)據(jù)庫(kù)索引以及失效場(chǎng)景詳解

    MySQL數(shù)據(jù)庫(kù)索引以及失效場(chǎng)景詳解

    索引是一種數(shù)據(jù)結(jié)構(gòu),為了應(yīng)對(duì)不同的場(chǎng)景會(huì)有多種實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)索引以及失效場(chǎng)景的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • mysql8.0.30安裝配置最詳細(xì)教程(windows?64位)

    mysql8.0.30安裝配置最詳細(xì)教程(windows?64位)

    這篇文章主要給大家介紹了關(guān)于windows?64位下mysql8.0.30安裝配置的相關(guān)資料,主要以圖片的形式展示安裝教程x,簡(jiǎn)單易懂,小白專屬,需要的朋友可以參考下
    2022-09-09
  • MySQL的join buffer原理

    MySQL的join buffer原理

    這篇文章主要介紹了MySQL的join buffer原理,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-04-04
  • MYSQL?Binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)詳解

    MYSQL?Binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)詳解

    MySQL一旦誤刪數(shù)據(jù)庫(kù)之后恢復(fù)數(shù)據(jù)很麻煩,這里記錄一下艱辛的恢復(fù)過(guò)程,這篇文章主要給大家介紹了關(guān)于如何利用MySQL的binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • InnoDB引擎中的事務(wù)詳解

    InnoDB引擎中的事務(wù)詳解

    這篇文章主要介紹了InnoDB引擎中的事務(wù)詳解,事務(wù)Transaction是訪問(wèn)和更新數(shù)據(jù)庫(kù)的程序執(zhí)行單元;事務(wù)中可能包含一個(gè)或多個(gè)sql語(yǔ)句,這些語(yǔ)句要么都執(zhí)行,要么都不執(zhí)行,需要的朋友可以參考下
    2023-09-09
  • 與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(三)--查看字段的長(zhǎng)度

    與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(三)--查看字段的長(zhǎng)度

    今天我們來(lái)對(duì)比下MYSQL和MSSQL關(guān)于查看字段長(zhǎng)度之間的區(qū)別
    2014-06-06
  • win7下MySql 5.7安裝配置方法圖文教程

    win7下MySql 5.7安裝配置方法圖文教程

    這篇文章主要為大家分享了win7下MySql 5.7安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-05-05
  • mysql的語(yǔ)句查詢順序、耗時(shí)分析以及查詢調(diào)優(yōu)技巧分享

    mysql的語(yǔ)句查詢順序、耗時(shí)分析以及查詢調(diào)優(yōu)技巧分享

    文章詳細(xì)介紹了MySQL中SQL查詢語(yǔ)句的執(zhí)行順序、耗時(shí)分析及查詢調(diào)優(yōu)方法,包括使用EXPLAIN、SHOW PROFILE和慢查詢?nèi)罩镜裙ぞ哌M(jìn)行耗時(shí)分析,以及使用索引、避免全表掃描、優(yōu)化查詢語(yǔ)句、分區(qū)表和調(diào)整服務(wù)器配置等技巧進(jìn)行性能優(yōu)化
    2025-02-02

最新評(píng)論

宁海县| 弋阳县| 长岭县| 巴马| 巍山| 乳源| 内丘县| 侯马市| 青川县| 和田县| 拉孜县| 潞城市| 山东| 错那县| 凤冈县| 忻城县| 浦江县| 黄浦区| 琼结县| 余江县| 西乡县| 长丰县| 嘉义县| 上杭县| 镇坪县| 凌源市| 沐川县| 兴化市| 贵港市| 桃园县| 乳山市| 得荣县| 客服| 龙岩市| 涿鹿县| 临汾市| 玛纳斯县| 绥化市| 泽州县| 广州市| 铜山县|