MySQL之應用層優化(三)

應用層優化

應用層緩存

  • 2.本地共享內存緩存
    這種緩存一般是中等大小(幾個GB),快速,難以在多臺機器間同步。它們對小型的半靜態位數據比較合適。例如每個州的城市列表,分片數據存儲的分區函數(映射表),或者使用存活時間(TTL)策略進行失效的數據等。共享內存最大的好處是訪問非常快——通常比其他任何遠程緩存訪問都要快不少
  • 3.分布式內存緩存
    最常見的分布式內存緩存的例子是memcached.分布式緩存比本地共享內存緩存要大得多,增長也容易。緩存中創建的數據每一個比特都只有一份副本,這樣既不會浪費內存,也不會因為相同的數據存在不同的地方而引入一致性問題。分布式內存非常適合存儲共享對象,例如用戶資料,評論,以及HTML片段。分布式緩存比本地共享緩存的延時要高得多,所以最高效的使用方法是批量進行多個獲取操作(例如,在一次循環中獲取多個對象)。分布式緩存還需要考慮怎么增加更多的節點,以及某個節點崩潰了怎么處理。對于這兩個場景,應用程序必需決定在節點間怎么分布或重分布緩存對象。當緩存集群增加或減少一臺服務器時,一致性緩存對避免性能問題而言是非常重要的。
  • 4.磁盤上的緩存
    磁盤是很慢的,所以緩存在磁盤上的最好是持久化對象,很難全部裝進內存的對象,或者靜態內容(例如預處理的自定義圖片)。對于磁盤上的緩存和Web服務器,一個非常有用的技巧是使用404錯誤處理機制來捕捉緩存未命中的情況。假設Web應用要在頭部展示一張基于用于名(“歡迎回來,John”)的自定義圖片。并且通過/images/welcomeback/john.jpg這樣的訪問路徑引用此圖片。如果圖片不存在,將會導致一個404錯誤,并且觸發上述錯誤處理。這個錯誤處理可以生成圖片,在磁盤上存儲它,然后發出一個重定向或者將該圖片傳回瀏覽器。后續的請求只需要從文件中直接返回圖片。有很多類型的內容可以使用這種技巧。例如,不用再將最近的標題作為HTML部分進行緩存,可以在Javascript文件中存儲這些東西,然后在網頁頭重引用這個文件:latest_headlines.js.緩存失效很簡單:刪除文件即可。可以通過執行一個刪除N分鐘前所創建的文件的定時任務,來實現TTL失效。如果想要限制緩存大小,也可以通過按最近訪問時間排序來刪除文件,從而實現最近最少使用(LRU)失效算法。如果失效策略是基于最近訪問時間,則必須在文件系統掛載參數中打開訪問時間記錄(忽略noatime選項即可),如果這么做,應該使用內存文件系統來避免大量磁盤操作。

緩存控制策略

緩存也有像反范式化數據庫設計一樣的問題:重復數據,也就是說有多個地方需要更新數據,所以需要想辦法避免讀到臟數據。下面是一些最常見的緩存控制策略:

  • 1.TTL(time to live,存活時間)
    緩存對象存儲時設置一個過期時間;可以通過清理進程在達到過期時間后刪掉最想,或者先留著直到下次訪問時再清理(清理后需要使用新的版本替換)。對于數據很少變更或者沒有新數據的情況,這是最好的失效策略
  • 2.顯式失效
    如果不能接受臟數據,那么進程在更新原始數據時需要同時使緩存失效。這種策略有兩個寫——失效和寫——更新。寫——失效策略很簡單:只需要標記緩存數據已經過期(是否清理緩存數據是可選的)。寫——更新策略需要多做一些工作,因為在更新數據時就需要替換掉緩存項。無論如何,這都是非常有益的,特別是當生成緩存數據代價很昂貴時(寫線程也許已經做了)。如果更新緩存數據,后續的請求將不在需要等待應用來生成。如果在后臺做失效處理,例如基于TTL的失效,就可以在一個從用戶請求完全分離出來的進程中生成失效數據的新版本
  • 3.讀時失效
    在更改舊數據時,為了避免要同時失效派生出來的臟數據,可以在緩存中保存一些信息,當從緩存讀數據時可以利用這些信息判斷數據是否已經失效。和顯式失效策略相比,這樣做有很大的優勢:成本固定且可以分散在不同時間內。假設要失效一個有一百萬緩存對象依賴的對象,如果采用寫時失效,需要一次在緩存中失效一百萬個對象,即使有高效的方法來找到這些對象,也可能需要很長的時間才能完成。如果采用讀時失效,寫操作可以立即完成,但后續這一百萬對象的讀操作可能會有略微的延遲。這樣就把失效一百萬對象的開銷分散了,并且可以幫助避免出現負載沖高和延遲增大的峰值。

一種最簡單的讀時失效的辦法時采用對象版本控制。使用這種方法,在緩存中存儲一個對象時,也可以存儲對象所依賴的數據的當前版本號或者時間戳。例如,假設要緩存用戶博客日志的統計信息,包括用戶所發表的博客數。當緩存blog_stats對象時,也可以同一時間存儲用戶的當前版本號,因為該統計信息是依賴于用戶的。
不管什么時候更新依賴于用戶的數據,都需要更新用戶的版本號,假設用戶的版本號初始為0,并且由你來生成和緩存統計信息。當用戶發表了一篇博客,就增加用戶的版本好到1(當然也要同時存儲這篇博客,盡管在這個例子并沒有用到博客數據)。然后當需要顯示統計數據的時候,可以對緩存中blog_stats對象的版本與緩存的用戶版本進行比較。因為用戶的版本比對象的版本高,所以可以直到緩存的統計信息已經過期了,需要重新計算。
這是一個非常粗糙的內容失效方式,因為它假設依賴于用戶的每一個比特的數據與所有其他數據都有交互。但這個假設并不總是成立的。舉個例子,如果一個用戶對一篇博客做了編輯,你也需要增加用戶的版本號,著就會導致存儲的統計信息失效,而實際上統計信息(發表的博客數)并沒真的改變。這個取舍是很簡單的。一個簡單的緩存失效策略不只是更容易創建,也可能更加高效。
對象版本控制是一種簡單的標記緩存方法,它可以處理更復雜的依賴關系。一個標記的緩存可以識別不同類型的依賴,并且分別跟蹤每個依賴的版本。在前面的圖書俱樂部的例子中,你可以通過下面的版本好標記評論,使緩存的評論依賴于用戶的版本和書的版本:user_ver=1234和book_ver=5678.任一版本號變了,都應該刷新緩存的評論

緩存對象分層

分層緩存對象對檢索、失效和內存利用都有幫助。相對于只緩存對象,也可以緩存對象的ID、對象的ID組等通常需要一起檢索的數據。電子商務網站的搜索結果是這種技術很好的例子。一次搜索可能返回一個匹配產品的列表,包括名稱、描述、縮略圖,以及價格。緩存整個列表的效率很低:其他的搜索也可能會包含一些相同的產品,這就會導致數據重復,并且浪費內存。這種策略也使得當一個產品價格變動時,找出并失效搜索結果變得很困難,因為你必須查看每個列表,找到哪些列表包含了更新過的產品。
可以緩存關于搜索的最小信息,而不必緩存整個列表,例如返回結果的數量以及列表中的產品ID。然后可以再單獨緩存每個產品。這樣做可以解決 兩個問題:不會重復存放任何結果數據,也更容易在失效產品的粒度上去失效緩存。缺點則是,相對于一次性獲得整個搜索結果,必須在緩存中檢索多個對象。然而不管怎么說,為搜索結果緩存產品ID的列表都是更有效的做法。先在一個緩存命中返回ID的列表,再使用這些ID去請求緩存獲得產品信息。如果緩存允許在一次調用里返回多個結果,第二次請求就可以返回多個產品(memcached通過mget()調用來支持)
如果使用不當,這種方法可能會導致奇怪的結果。假設使用TTL策略來失效搜索結果,并且當產品變更時顯式地區失效單個產品。現在想象以下,一個產品地描述發生了變化,不再包含搜索中匹配地關鍵字,但是搜索結果地緩存還沒有過期失效,此時用戶就會看到錯誤地搜索結果,因為緩存的搜索結果將會引用這個變化了的產品,即使它不再包含匹配搜索的關鍵字。
對于大多數應用程序來說,這不是問題。如果應用程序不能容忍這種情況,可以使用基于版本的緩存,并在執行搜索時在結果中存儲產品的版本好。當發現搜索結果在緩存中時,可以將當前搜索結果的版本號和搜索結果中的每個產品的版本號做比較。如果發現任何一個產品的版本數據不一致,可以重新搜索并且重新緩存結果。這對理解遠程緩存訪問的花銷是多么昂貴非常重要。雖然緩存很快,也可以避免很多工作,但在LAN環境下網絡往返緩存服務器通常也需要0.3ms左右。我們見過很多案例,復雜的網頁需要一千次左右的緩存訪問來組合頁面結果,這將會耗費3s左右的網絡延時,意味著你的頁面可能慢得不可接受,即使它甚至不需要訪問數據庫!因此,在這種情況下對緩存使用批量獲取調用是非常重要的。對緩存分層,采用小一些的本地緩存,也可能獲得很大的收益

預生成內容

除了在應用程序幾倍緩存位數據,也可以在后臺預先請求一些頁面,并且將結果存為靜態頁面。如果頁面是動態的,也可以預先生成頁面的部分內容,然后使用像服務端包含(SSI)這樣的技術創建最終頁面。這有助于減小生成預生成內容的大小和開銷,否則可能在將不同部分拼裝到最終頁面的時候,由于微小的變化產生大量的重復內容。幾乎可以對任何類型的緩存使用預生成策略,包括memcached.預生成內容有幾個重要的好處。

  • 1.應用代碼沒有復雜的命中和未命中處理路徑
  • 2.當未命中的處理路徑慢得不可接受時,這種方案可以很好地工作,因為它保證了未命中的情況永遠不會發生。實際上,在任何時候設計任何類型的緩存系統,總是應該考慮未命中的路徑有多曼。如果平均性能提升很大,但是因為要預生成緩存內容,偶爾有一些請求變得非常緩慢,這時可能比不用緩存還糟糕。性能的持續穩定通常跟高性能一樣重要
  • 3.預生成可以避免在緩存未命中時異常的雪崩效應
    緩存預生成號的內容可能占用大量空間,并且并不總能預生成所有東西。無論是哪種形式的緩存,需要預生成的內容中最重要的部分是哪些最經常被請求,或者生成的成本最高的,所以可以通過404錯誤處理機制來按需生成。預生成的內容有時候也可以從內存文件系統中獲益,因為可以避免磁盤IO

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

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

相關文章

記錄一次Chrome瀏覽器自動排序ajax請求的JSON數據問題

文章目錄 1.前言2. 為什么會這樣?3.如何解決? 1.前言 作者作為新人入職的第一天,mentor給了一個維護公司運營平臺的小需求,具體需求是根據運營平臺的某個管理模塊所展示記錄的某些字段對展示記錄做排序。 第一步: myb…

工業觸摸一體機優化MES應用開發流程

工業觸摸一體機在現代工業生產中扮演著至關重要的角色,它集成了智能觸摸屏和工業計算機的功能,廣泛應用于各種生產場景中。而制造執行系統(MES)作為工業生產管理的重要工具,對于提高生產效率、降低成本、優化資源利用具…

力扣hot100-普通數組

文章目錄 題目:最大子數組和方法1 動態規劃方法2 題目:合并區間題解 題目:最大子數組和 原題鏈接:最大子數組和 方法1 動態規劃 public class T53 {//動態規劃public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基礎知識-編譯相關

記錄C語言相關的基礎知識 1 C源碼到可執行文件的四個階段 預處理(.i)、編譯(.s)、匯編(.obj)、鏈接。 1.1 預處理 預處理階段,主要完成宏替換、文件展開、注釋刪除、條件編譯展開、添加行號和文件名標識,輸出.i/.ii預處理文件。 宏替換,…

【UML用戶指南】-26-對高級行為建模-狀態圖

目錄 1、概念 2、組成結構 3、一般用法 4、常用建模技術 4.1、對反應型對象建模 一個狀態圖顯示了一個狀態機。在為對象的生命期建模中 活動圖展示的是跨過不同的對象從活動到活動的控制流 狀態圖展示的是單個對象內從狀態到狀態的控制流。 在UML中,用狀態圖…

tcpdump命令詳解及使用實例

1、抓所有網卡數據包,保存到指定路徑 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump簡介 tcpdump可以將網絡中傳送的數據包完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來去掉無用的信…

【Python】已解決:SyntaxError: positional argument follows keyword argument

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決:SyntaxError: positional argument follows keyword argument 一、分析問題背景 在Python編程中,當我們在調用函數時混合使用位置參數(p…

RabbitMQ進階篇

文章目錄 發送者的可靠性生產者重試機制實現生產者確認 MQ的可靠性數據持久化交換機持久化隊列持久化消息持久化 Lazy Queue(可配置~)控制臺配置Lazy模式代碼配置Lazy模式更新已有隊列為lazy模式 消費者的可靠性消費者確認機制失敗重試機制失敗處理策略 業務冪等性唯一消息ID業…

西部智慧健身小程序+華為運動健康服務

1、 應用介紹 西部智慧健身小程序為用戶提供一站式全流程科學健身綜合服務。用戶通過登錄微信小程序,可享用健康篩查、運動風險評估、體質檢測評估、運動處方推送、個人運動數據監控與評估等公益服務。 2、 體驗介紹西部智慧健身小程序華為運動健康服務核心體驗如…

idea xml ctrl+/ 注釋格式不對齊

處理前 處理后 解決辦法 取消這兩個勾選

核方法總結(三)———核主成分(kernel PCA)學習筆記

一、核主成分 1.1 和PCA的區別 PCA (主成分分析)對應一個線性高斯模型(參考書的第二章),其基本假設是數據由一個符合正態分布的隱變量通過一個線性映射得到,因此可很好描述符合高斯分布的數據。然而在很多實…

ViewBinding的使用(因為kotlin-android-extensions插件的淘汰)

書籍: 《第一行代碼 Android》第三版 開發環境: Android Studio Jellyfish | 2023.3.1 問題: 3.2.4在Activity中使用Toast章節中使用到了kotlin-android-extensions插件,但是該插件已經淘汰,根據網上了解,目前使用了新的技術VewBinding替…

UE4_材質_材質節點_DepthFade

一、DepthFade參數 DepthFade(深度消退)表達式用來隱藏半透明對象與不透明對象相交時出現的不美觀接縫。 項目說明屬性消退距離(Fade Distance)這是應該發生消退的全局空間距離。未連接 FadeDistance(FadeDistance&a…

【數據分析“三劍客”】—— Pandas

Pandas Pandas 是基于NumPy的一種工具,該工具是為解決數據分析任務而創建的, Pandas提供了大量能使我們快速便捷地處理數據的函數和方法。Pandas與出色的 Jupyter工具包和其他庫相結合,Python中用于進行數據分析的環境在性能、生產率和協作能力方面都是…

光照老化試驗箱:材料耐久性的“時間加速器”

光照老化試驗箱:材料耐久性的“時間加速器”概述 光照老化試驗箱是一種模擬自然光照條件下材料老化過程的設備,廣泛應用于材料科學領域的耐久性能評估。通過模擬日光中的紫外線、熱輻射等環境因素,加速材料老化過程,以此來驗證材…

redhawk:tech file與lefdef layer name不匹配問題

我正在「拾陸樓」和朋友們討論有趣的話題,你?起來吧? 拾陸樓知識星球入口 一些工藝廠商給的redhawk tech file是加密的,讀完tech file再讀lef/def會報錯,根本不知道問題在哪,他們一般會搭配給一個layer map&#xff…

分解+降維+預測!多重創新!直接寫核心!EMD-KPCA-Transformer多變量時間序列光伏功率預測

分解降維預測!多重創新!直接寫核心!EMD-KPCA-Transformer多變量時間序列光伏功率預測 目錄 分解降維預測!多重創新!直接寫核心!EMD-KPCA-Transformer多變量時間序列光伏功率預測效果一覽基本介紹程序設計參…

【簡單講解神經網絡訓練中batch的作用】

🎥博主:程序員不想YY啊 💫CSDN優質創作者,CSDN實力新星,CSDN博客專家 🤗點贊🎈收藏?再看💫養成習慣 ?希望本文對您有所裨益,如有不足之處,歡迎在評論區提出…

Maven依賴解析過程詳細講解

Maven依賴解析是一個遞歸的過程,涉及從項目的POM文件開始,逐步解析直接依賴和傳遞依賴。以下是詳細的解析過程: 讀取項目的POM文件: Maven首先讀取項目的POM文件 (pom.xml),該文件定義了項目的直接依賴。 解析直接依賴…

STM32第十五課:LCD屏幕及應用

文章目錄 需求一、LCD顯示屏二、全屏圖片三、數據顯示1.顯示歡迎詞2.顯示溫濕度3.顯示當前時間 四、需求實現代碼 需求 1.在LCD屏上顯示一張全屏圖片。 2.在LCD屏上顯示當前時間,溫度,濕度。 一、LCD顯示屏 液晶顯示器,簡稱 LCD(Liquid Cry…