日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

队列处理高并发_高并发场景下缓存处理的一些思路

發布時間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列处理高并发_高并发场景下缓存处理的一些思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在實際的開發當中,我們經常需要進行磁盤數據的讀取和搜索,因此經常會有出現從數據庫讀取數據的場景出現。

但是當數據訪問量次數增大的時候,過多的磁盤讀取可能會最終成為整個系統的性能瓶頸,甚至是壓垮整個數據庫,導致系統卡死等嚴重問題。

常規的應用系統中,我們通常會在需要的時候對數據庫進行查找,因此系統的大致結構如下所示:

當數據量較高的時候,需要減少對于數據庫里面的磁盤讀寫操作,因此通常都會選擇在業務系統和MySQL數據庫之間加入一層緩存從而減少對數據庫方面的訪問壓力。

但是很多時候,緩存在實際項目中的應用并非這么簡單。下邊我們來通過幾個比較經典的緩存應用場景來列舉一些問題:

1.緩存和數據庫之間數據一致性問題

常用于緩存處理的機制我總結為了以下幾種:

  • Cache Aside
  • Read Through
  • Write Through
  • Write Behind Caching

首先來簡單說說Cache aside的這種方式:

Cache Aside模式

這種模式處理緩存通常都是先從數據庫緩存查詢,如果緩存沒有命中則從數據庫中進行查找。

這里面會發生的三種情況如下:

緩存命中:

當查詢的時候發現緩存存在,那么直接從緩存中提取。

緩存失效:

當緩存沒有數據的時候,則從database里面讀取源數據,再加入到cache里面去。

緩存更新:

當有新的寫操作去修改database里面的數據時,需要在寫操作完成之后,讓cache里面對應的數據失效。

這種Cache aside模式通常是我們在實際應用開發中最為常用到的模式。但是并非說這種模式的緩存處理就一定能做到完美。

關于這種模式下依然會存在缺陷。

比如,一個是讀操作,但是沒有命中緩存,然后就到數據庫中取數據,此時來了一個寫操作,寫完數據庫后,讓緩存失效,然后,之前的那個讀操作再把老的數據放進去,所以,會造成臟數據。

Facebook的大牛們也曾經就緩存處理這個問題發表過相關的論文,鏈接如下:

https://www.usenix.org/system/files/conference/nsdi13/nsdi13-final170_update.pdf

分布式環境中要想完全的保證數據一致性是一件極為困難的事情,我們只能夠盡可能的減低這種數據不一致性問題產生的情況。

Read Through模式

Read Through模式是指應用程序始終從緩存中請求數據。如果緩存沒有數據,則它負責使用底層提供程序插件從數據庫中檢索數據。檢索數據后,緩存會自行更新并將數據返回給調用應用程序。使用Read Through 有一個好處。

我們總是使用key從緩存中檢索數據, 調用的應用程序不知道數據庫, 由存儲方來負責自己的緩存處理,這使代碼更具可讀性, 代碼更清晰。

但是這也有相應的缺陷,開發人員需要給編寫相關的程序插件,增加了開發的難度性。

Write Through模式

Write Through模式和Read Through模式類似,當數據發生更新的時候,先去Cache里面進行更新,如果命中了,則先更新緩存再由Cache方來更新database。如果沒有命中的話,就直接更新Cache里面的數據。

Write Behind Caching模式

Write Behind Caching 這種模式通常是先將數據寫入到緩存里面,然后再異步的寫入到database中進行數據同步

這樣的設計既可以直接的減少我們對于數據的database里面的直接訪問,降低壓力,同時對于database的多次修改可以進行合并操作,極大的提升了系統的承載能力。

但是這種模式處理緩存數據具有一定的風險性,例如說當cache機器出現宕機的時候,數據會有丟失的可能。

2.緩存穿透問題

在高并發的場景中,緩存穿透是一個經常都會遇到的問題。

什么是緩存穿透?

大量的請求在緩存中沒有查詢到指定的數據,因此需要從數據庫中進行查詢,造成緩存穿透。

會造成什么后果?

大量的請求短時間內涌入到database中進行查詢會增加database的壓力,最終導致database無法承載客戶單請求的壓力,出現宕機卡死等現象。

常用的解決方案通常有以下幾類:

1.空值緩存

在某些特定的業務場景中,對于數據的查詢可能會是空的,沒有實際的存在,并且這類數據信息在短時間進行多次的反復查詢也不會有變化,那么整個過程中,多次的請求數據庫操作會顯得有些多余。

不妨可以將這些空值(沒有查詢結果的數據)對應的key存儲在緩存中,那么第二次查找的時候就不需要再次請求到database那么麻煩,只需要通過內存查詢即可。這樣的做法能夠大大減少對于database的訪問壓力。

2.布隆過濾器

通常對于database里面的數據的key值可以預先存儲在布隆過濾器里面去,然后先在布隆過濾器里面進行過濾

如果發現布隆過濾器中沒有的話,就再去redis里面進行查詢,如果redis中也沒有數據的話,再去database查詢。這樣可以避免不存在的數據信息也去往存儲庫中進行查詢情況。

關于布隆過濾器的學習可以參考下我的這篇筆記:

https://blog.csdn.net/Danny_idea/article/details/88946673

3.緩存雪崩場景

什么是緩存雪崩?

當緩存服務器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給后端系統(比如DB)帶來很大壓力。

如何避免緩存雪崩問題?

1.使用加鎖隊列來應付這種問題。當有多個請求涌入的時候,當緩存失效的時候加入一把分布式鎖,只允許搶鎖成功的請求去庫里面讀取數據然后將其存入緩存中,再釋放鎖,讓后續的讀請求從緩存中取數據。

但是這種做法有一定的弊端,過多的讀請求線程堵塞,將機器內存占滿,依然沒有能夠從根本上解決問題。

2.在并發場景發生前,先手動觸發請求,將緩存都存儲起來,以減少后期請求對database的第一次查詢的壓力。

數據過期時間設置盡量分散開來,不要讓數據出現同一時間段出現緩存過期的情況。

3.從緩存可用性的角度來思考,避免緩存出現單點故障的問題,可以結合使用 主從+哨兵的模式來搭建緩存架構

但是這種模式搭建的緩存架構有個弊端,就是無法進行緩存分片,存儲緩存的數據量有限制,因此可以升級為Redis Cluster架構來進行優化處理

(需要結合企業實際的經濟實力,畢竟Redis Cluster的搭建需要更多的機器)

4.Ehcache本地緩存 + Hystrix限流&降級,避免MySQL被打死。

使用 Ehcache本地緩存的目的也是考慮在 Redis Cluster 完全不可用的時候,Ehcache本地緩存還能夠支撐一陣。

使用 Hystrix進行限流 & 降級 ,比如一秒來了5000個請求,我們可以設置假設只能有一秒 2000個請求能通過這個組件,那么其他剩余的 3000 請求就會走限流邏輯。

然后去調用我們自己開發的降級組件(降級),比如設置的一些默認值呀之類的。以此來保護最后的 MySQL 不會被大量的請求給打死。

喜歡的點個關注,一起學習探討新技術。

總結

以上是生活随笔為你收集整理的队列处理高并发_高并发场景下缓存处理的一些思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。