當前位置:首頁 » 硬碟大全 » 利用緩存解決並發
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

利用緩存解決並發

發布時間: 2023-01-08 07:54:11

⑴ 如何處理大量數據高並發大流量並發操作方案

大數據並發處理解決方案:
1、HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,所以盡可能使網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。但是對於大量內容並且頻繁更新的網站,無法全部手動去挨個實現,於是出現了常見的信息發布系統CMS,像常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發布系統來管理和實現的,信息發布系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、許可權管理、自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。
2、圖片伺服器分離
對於Web伺服器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,於是有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的圖片伺服器,甚至很多台圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰,在應用伺服器和圖片伺服器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以盡量少支持,盡可能少的LoadMole,保證更高的系統消耗和執行效率。 這一實現起來是比較容易的一現,如果伺服器集群操作起來更方便,如果是獨立的伺服器,新手可能出現上傳圖片只能在伺服器本地的情況下,可以在令一台伺服器設置的IIS採用網路路徑來實現圖片伺服器,即不用改變程序,又能提高性能,但對於伺服器本身的IO處理性能是沒有任何的改變。
3、資料庫集群和庫表散列
大型網站都有復雜的應用,這些應用必須使用資料庫,那麼在面對大量訪問的時候,資料庫的瓶頸很快就能顯現出來,這時一台資料庫將很快無法滿足應用,於是需要使用資料庫集群或者庫表散列。
4、緩存
緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發中的緩存也是非常重要。架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。
網站程序開發方面的緩存,Linux上提供的Memory Cache是常用的緩存介面,可以在web開發中使用,比如用Java開發的時候就可以調用MemoryCache對一些數據進行緩存和通訊共享,一些大型社區使用了這樣的架構。另外,在使用web語言開發的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。
5、鏡像
鏡像是大型網站常採用的提高性能和數據安全性的方式,鏡像的技術可以解決不同網路接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和ENet之間的差異就促使了很多網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這里不闡述太深,有很多專業的現成的解決架構和產品可選。也有廉價的通過軟體實現的思路,比如Linux上的rsync等工具。
6、負載均衡
負載均衡將是大型網站解決高負荷訪問和大量並發請求採用的終極解決辦法。 負載均衡技術發展了多年,有很多專業的服務提供商和產品可以選擇。
硬體四層交換
第四層交換使用第三層和第四層信息包的報頭信息,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用伺服器進行處理。第四層交換功能就象是虛IP,指向物理伺服器。它傳輸的業務服從的協議多種多樣,有HTTP、FTP、NFS、Telnet或其他協議。這些業務在物理伺服器基礎上,需要復雜的載量平衡演算法。在IP世界,業務類型由終端TCP或UDP埠地址來決定,在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP埠共同決定。
在硬體四層交換產品領域,有一些知名的產品可以選擇,比如Alteon、F5等,這些產品很昂貴,但是物有所值,能夠提供非常優秀的性能和很靈活的管理能力。Yahoo中國當初接近2000台伺服器使用了三四台Alteon就搞定了。

⑵ 現在有哪些技術能夠提高.Net的並發和緩存

這些並發,可以通過增加應用伺服器來達到,緩存可以使用 "System.Web.Caching.Cache"來增加,由於目前不知道增加這些並發和緩存的作用,所以下面只能列舉常用的方法給你哦!

一、緩解資料庫讀取壓力

這個緩存機制使用的是.Net本身提供的緩存功能,System.Web.Caching.Cache
這個方案可以解決一般訪問量不是很大的站點的需求,更高一級的,可以通過增加Web園工作進程來達到提升性能的需求,而且這個方案裡面,已經解決多進程下緩存同步的問題。

更高層次的緩存只用到內存資料庫如:Redis Memcached ...

由於增加了緩存服務,可以解決大部分高並發訪問需求。

二、緩解Web伺服器壓力

1 增加公用資源文件訪問CDN (將 js pic 這些站點必須的文件採用公用CDN)

2 使用單獨的文件伺服器

3 增加web伺服器進行負載均衡設計

三、緩解資料庫壓力

    資料庫讀寫分離處理

    --------------------------

    請採納!

⑶ 分布式緩存重建並發沖突

基於三級緩存架構的分布式系統中,如果緩存服務在本地的 Ehcache 中都讀取不到數據,此時需要重新到源頭的服務中去拉去數據,拉取到數據之後,趕緊先給 Nginx 的請求返回,同時將數據寫入 Ehcache 和 Redis中。此時會出現分布式重建緩存的並發沖突問題,導致三級緩存失效。

分布式緩存重建並發沖突問題的具體原因是由於多個緩存服務實例提供服務,如果發現緩存失效,那麼就會去重建,這個時候回出現以下幾種情況:

1.變更緩存重建以及空緩存請求重建,更新 redis 之前,都需要先獲取對應商品 id 的分布式鎖。

⑷ 如何處理高並發

處理高並發的六種方法

1:系統拆分,將一個系統拆分為多個子系統,用bbo來搞。然後每個系統連一個資料庫,這樣本來就一個庫,現在多個資料庫,這樣就可以抗高並發。

2:緩存,必須得用緩存。大部分的高並發場景,都是讀多寫少,那你完全可以在資料庫和緩存里都寫一份,然後讀的時候大量走緩存不就得了。畢竟人家redis輕輕鬆鬆單機幾萬的並發啊。沒問題的。所以你可以考的慮考慮你的項目里,那些承載主要請求讀場景,怎麼用緩存來抗高並發。

3:MQ(消息隊列),必須得用MQ。可能你還是會出現高並發寫的場景,比如說一個業務操作里要頻繁搞資料庫幾十次,增刪改增刪改,瘋了。那高並發絕對搞掛你的系統,人家是緩存你要是用redis來承載寫那肯定不行,數據隨時就被LRU(淘汰掉最不經常使用的)了,數據格式還無比簡單,沒有事務支持。所以該用mysql還得用mysql啊。那你咋辦?用MQ吧,大量的寫請求灌入MQ里,排隊慢慢玩兒,後邊系統消費後慢慢寫,控制在mysql承載范圍之內。所以你得考慮考慮你的項目里,那些承載復雜寫業務邏輯的場景里,如何用MQ來非同步寫,提升並發性。MQ單機抗幾萬並發也是ok的。

4:分庫分表,可能到了最後資料庫層面還是免不了抗高並發的要求,好吧,那麼就將一個資料庫拆分為多個庫,多個庫來抗更高的並發;然後將一個表拆分為多個表,每個表的數據量保持少一點,提高sql跑的性能。

5:讀寫分離,這個就是說大部分時候資料庫可能也是讀多寫少,沒必要所有請求都集中在一個庫上吧,可以搞個主從架構,主庫寫入,從庫讀取,搞一個讀寫分離。讀流量太多的時候,還可以加更多的從庫。

6:solrCloud:
SolrCloud(solr 雲)是Solr提供的分布式搜索方案,可以解決海量數據的 分布式全文檢索,因為搭建了集群,因此具備高可用的特性,同時對數據進行主從備份,避免了單點故障問題。可以做到數據的快速恢復。並且可以動態的添加新的節點,再對數據進行平衡,可以做到負載均衡:

⑸ 應對Memcached緩存失效,導致高並發查詢DB的幾種思路

1.定期從DB里查詢數據,再刷到memcached里
這種方法有個缺點是,有些業務的key可能是變化的,不確定的。
而且不好界定哪些數據是應該查詢出來放到緩存中的,難以區分冷熱數據。

2.當緩存取到為null時,加鎖去查詢DB,只允許一個線程去查詢DB
這種方式不太靠譜,不多討論。而且如果是多個web伺服器的話,還是有可能有並發的操作。

3.在向memcached寫入value時,同時寫入當前機器在時間作為過期時間
當get得到數據時,如果當前時間 - 過期時間 > 5s,則後台啟動一個任務去查詢DB,更新緩存。
當然,這里的後台任務必須保證同一個key,只有一個線程在執行查詢DB的任務,不然這個還是高並發查詢DB。
缺點是要把過期時間和value合在一起序列化,取出數據後,還要反序列化。很不方便。

網上大部分文章提到的都是前面兩種方式,有少數文章提到第3種方式。下面提出一種基於兩個key的方法:
4.兩個key,一個key用來存放數據,另一個用來標記失效時間
比如key是aaa,設置失效時間為30s,則另一個key為expire_aaa,失效時間為25s。
在取數據時,用multiget,同時取出aaa和expire_aaa,如果expire_aaa的value == null,則後台啟動一個任務去查詢DB,更新緩存。和上面類似。

對於後台啟動一個任務去查詢DB,更新緩存,要保證一個key只有一個線程在執行,這個如何實現?
對於同一個進程,簡單加鎖即可。拿到鎖的就去更新DB,沒拿到鎖的直接返回。

對於集群式的部署的,如何實現只允許一個任務執行?
這里就要用到memcached的add命令了。
add命令是如果不存在key,則設置成功,返回true,如果已存在key,則不存儲,返回false。
當get expired_aaa是null時,則add expired_aaa 過期時間由自己靈活處理。比如設置為3秒。
如果成功了,再去查詢DB,查到數據後,再set expired_aaa為25秒。set aaa 為30秒。
綜上所述,來梳理下流程:
比如一個key是aaa,失效時間是30s。查詢DB在1s內。

put數據時,設置aaa過期時間30s,設置expire_aaa過期時間25s;
get數據時,multiget aaa 和 expire_aaa,如果expired_aaa對應的value != null,則直接返回aaa對應的數據給用戶。如果expire_aaa返回value == null,則後台啟動一個任務,嘗試add expire_aaa,並設置超時過間為3s。這里設置為3s是為了防止後台任務失敗或者阻塞,如果這個任務執行失敗,那麼3秒後,如果有另外的用戶訪問,那麼可以再次嘗試查詢DB。如果add執行成功,則查詢DB,再更新aaa的緩存,並設置expire_aaa的超時時間為25s。
5. 時間存到Value里,再結合add命令來保證只有一個線程去刷新數據
update:2014-06-29
最近重新思考了下這個問題。發現第4種兩個key的辦法比較耗memcached的內存,因為key數翻倍了。結合第3種方式,重新設計了下,思路如下:

仍然使用兩個key的方案:

key
__load_{key}
其中,__load_{key} 這個key相當於一個鎖,只允許add成功的線程去更新數據,而這個key的超時時間是比較短的,不會一直佔用memcached的內存。

在set 到Memcached的value中,加上一個時間,(time, value),time是memcached上的key未來會過期的時間,並不是當前系統時間。
當get到數據時,檢查時間是否快要超時: time - now < 5 * 1000,假定設置了快要超時的時間是5秒。

* 如果是,則後台啟動一個新的線程:
* 嘗試 add __load_{key},
* 如果成功,則去載入新的數據,並set到memcached中。
* 原來的線程直接返回value給調用者。

⑹ 如何處理資料庫並發問題

想要知道如何處理數據並發,自然需要先了解數據並發。

什麼是數據並發操作呢?
就是同一時間內,不同的線程同時對一條數據進行讀寫操作。

在互聯網時代,一個系統常常有很多人在使用,因此就可能出現高並發的現象,也就是不同的用戶同時對一條數據進行操作,如果沒有有效的處理,自然就會出現數據的異常。而最常見的一種數據並發的場景就是電商中的秒殺,成千上萬個用戶對在極端的時間內,搶購一個商品。針對這種場景,商品的庫存就是一個需要控制的數據,而多個用戶對在同一時間對庫存進行重寫,一個不小心就可能出現超賣的情況。

針對這種情況,我們如何有效的處理數據並發呢?

第一種方案、資料庫鎖
從鎖的基本屬性來說,可以分為兩種:一種是共享鎖(S),一種是排它鎖(X)。在MySQL的資料庫中,是有四種隔離級別的,會在讀寫的時候,自動的使用這兩種鎖,防止數據出現混亂。

這四種隔離級別分別是:

讀未提交(Read Uncommitted)
讀提交(Read Committed)
可重復讀(Repeated Read)
串列化(Serializable)
當然,不同的隔離級別,效率也是不同的,對於數據的一致性保證也就有不同的結果。而這些可能出現的又有哪些呢?

臟讀(dirty read)

當事務與事務之間沒有任何隔離的時候,就可能會出現臟讀。例如:商家想看看所有的訂單有哪些,這時,用戶A提交了一個訂單,但事務還沒提交,商家卻看到了這個訂單。而這時就會出現一種問題,當商家去操作這個訂單時,可能用戶A的訂單由於部分問題,導致數據回滾,事務沒有提交,這時商家的操作就會失去目標。

不可重復讀(unrepeatable read)

一個事務中,兩次讀操作出來的同一條數據值不同,就是不可重復讀。

例如:我們有一個事務A,需要去查詢一下商品庫存,然後做扣減,這時,事務B操作了這個商品,扣減了一部分庫存,當事務A再次去查詢商品庫存的時候,發現這一次的結果和上次不同了,這就是不可重復讀。

幻讀(phantom problem)

一個事務中,兩次讀操作出來的結果集不同,就是幻讀。

例如:一個事務A,去查詢現在已經支付的訂單有哪些,得到了一個結果集。這時,事務B新提交了一個訂單,當事務A再次去查詢時,就會出現,兩次得到的結果集不同的情況,也就是幻讀了。

那針對這些結果,不同的隔離級別可以干什麼呢?

「讀未提(Read Uncommitted)」能預防啥?啥都預防不了。

「讀提交(Read Committed)」能預防啥?使用「快照讀(Snapshot Read)」方式,避免「臟讀」,但是可能出現「不可重復讀」和「幻讀」。

「可重復讀(Repeated Red)」能預防啥?使用「快照讀(Snapshot Read)」方式,鎖住被讀取記錄,避免出現「臟讀」、「不可重復讀」,但是可能出現「幻讀」。

「串列化(Serializable)」能預防啥?有效避免「臟讀」、「不可重復讀」、「幻讀」,不過運行效率奇差。

好了,鎖說完了,但是,我們的資料庫鎖,並不能有效的解決並發的問題,只是盡可能保證數據的一致性,當並發量特別大時,資料庫還是容易扛不住。那解決數據並發的另一個手段就是,盡可能的提高處理的速度。

因為數據的IO要提升難度比較大,那麼通過其他的方式,對數據進行處理,減少資料庫的IO,就是提高並發能力的有效手段了。

最有效的一種方式就是:緩存
想要減少並發出現的概率,那麼讀寫的效率越高,讀寫的執行時間越短,自然數據並發的可能性就變小了,並發性能也有提高了。

還是用剛才的秒殺舉例,我們為的就是保證庫存的數據不出錯,賣出一個商品,減一個庫存,那麼,我們就可以將庫存放在內存中進行處理。這樣,就能夠保證庫存有序的及時扣減,並且不出現問題。這樣,我們的資料庫的寫操作也變少了,執行效率也就大大提高了。

當然,常用的分布式緩存方式有:Redis和Memcache,Redis可以持久化到硬碟,而Memcache不行,應該怎麼選擇,就看具體的使用場景了。

當然,緩存畢竟使用的范圍有限,很多的數據我們還是必須持久化到硬碟中,那我們就需要提高資料庫的IO能力,這樣避免一個線程執行時間太長,造成線程的阻塞。

那麼,讀寫分離就是另一種有效的方式了
當我們的寫成為了瓶頸的時候,讀寫分離就是一種可以選擇的方式了。

我們的讀庫就只需要執行讀,寫庫就只需要執行寫,把讀的壓力從主庫中分離出去,讓主庫的資源只是用來保證寫的效率,從而提高寫操作的性能。

⑺ 分布式緩存主要用在高並發環境下的作用

分布式緩存主要用在高並發環境下,減輕資料庫的壓力,提高系統的響應速度和並發吞吐。當大量的讀、寫請求湧向資料庫時,磁碟的處理速度與內存顯然不在一個量級,因此,在資料庫之前加一層緩存,能夠顯著提高系統的響應速度,並降低資料庫的壓力。作為傳統的關系型資料庫,MySQL提供完整的ACID操作,支持豐富的數據類型、強大的關聯查詢、where語句等,能夠非常客易地建立查詢索引,執行復雜的內連接、外連接、求和、排序、分組等操作,並且支持存儲過程、函數等功能,產品成熟度高,功能強大。但是,對於需要應對高並發訪問並且存儲海量數據的場景來說,出於對性能的考慮,不得不放棄很多傳統關系型資料庫原本強大的功能,犧牲了系統的易用性,並且使得系統的設計和管理變得更為復雜。這也使得在過去幾年中,流行著另一種新的存儲解決方案——NoSQL,它與傳統的關系型資料庫最大的差別在於,它不使用SQL作為查詢語言來查找數據,而採用key-value形式進行查找,提供了更高的查詢效率及吞吐,並且能夠更加方便地進行擴展,存儲海量數據,在數千個節點上進行分區,自動進行數據的復制和備份。在分布式系統中,消息作為應用間通信的一種方式,得到了十分廣泛的應用。消息可以被保存在隊列中,直到被接收者取出,由於消息發送者不需要同步等待消息接收者的響應,消息的非同步接收降低了系統集成的耦合度,提升了分布式系統協作的效率,使得系統能夠更快地響應用戶,提供更高的吞吐。
當系統處於峰值壓力時,分布式消息隊列還能夠作為緩沖,削峰填谷,緩解集群的壓力,避免整個系統被壓垮。垂直化的搜索引擎在分布式系統中是一個非常重要的角色,它既能夠滿足用戶對於全文檢索、模糊匹配的需求,解決資料庫like查詢效率低下的問題,又能夠解決分布式環境下,由於採用分庫分表,或者使用NoSQL資料庫,導致無法進行多表關聯或者進行復雜查詢的問題。

⑻ 如何解決高並發問題

使用高性能的伺服器、高性能的資料庫、高效率的編程語言、還有高性能的Web容器,(對架構分層+負載均衡+集群)這幾個解決思路在一定程度上意味著更大的投入。

1、高並發:在同一個時間點,有大量的客戶來訪問我們的網站,如果訪問量過大,就可能造成網站癱瘓。

2、高流量:當網站大後,有大量的圖片,視頻,這樣就會對流量要求高,需要更多更大的帶寬。

3、大存儲:可能對數據保存和查詢出現問題。

解決方案:

1、提高硬體能力、增加系統伺服器。(當伺服器增加到某個程度的時候系統所能提供的並發訪問量幾乎不變,所以不能根本解決問題)

2、本地緩存:本地可以使用JDK自帶的Map、Guava Cache.分布式緩存:Redis、Memcache.本地緩存不適用於提高系統並發量,一般是用處用在程序中。

Spiring把已經初始過的變數放在一個Map中,下次再要使用這個變數的時候,先判斷Map中有沒有,這也就是系統中常見的單例模式的實現。

⑼ 華為技術架構師分享:高並發場景下緩存處理的一些思路

在實際的開發當中,我們經常需要進行磁碟數據的讀取和搜索,因此經常會有出現從資料庫讀取數據的場景出現。但是當數據訪問量次數增大的時候,過多的磁碟讀取可能會最終成為整個系統的性能瓶頸,甚至是壓垮整個資料庫,導致系統卡死等嚴重問題。

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

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

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

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

Cache Aside模式

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

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

緩存命中:

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

緩存失效:

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

緩存更新:

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

關於這種模式下依然會存在缺陷。比如,一個是讀操作,但是沒有命中緩存,然後就到資料庫中取數據,此時來了一個寫操作,寫完資料庫後,讓緩存失效,然後,之前的那個讀操作再把老的數據放進去,所以,會造成臟數據。

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

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

Read Through模式

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

我們總是使用key從緩存中檢索數據, 調用的應用程序不知道資料庫, 由存儲方來負責自己的緩存處理,這使代碼更具可讀性, 代碼更清晰。但是這也有相應的缺陷,開發人員需要給編寫相關的程序插件,增加了開發的難度性。

Write Through模式

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

2.緩存穿透問題

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

什麼是緩存穿透?

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

會造成什麼後果?

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

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

1.空值緩存

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

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

2.布隆過濾器

通常對於database裡面的數據的key值可以預先存儲在布隆過濾器裡面去,然後先在布隆過濾器裡面進行過濾,如果發現布隆過濾器中沒有的話,就再去redis裡面進行查詢,如果redis中也沒有數據的話,再去database查詢。這樣可以避免不存在的數據信息也去往存儲庫中進行查詢情況。

什麼是緩存雪崩?

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

如何避免緩存雪崩問題?

1.使用加鎖隊列來應付這種問題。當有多個請求湧入的時候,當緩存失效的時候加入一把分布式鎖,只允許搶鎖成功的請求去庫裡面讀取數據然後將其存入緩存中,再釋放鎖,讓後續的讀請求從緩存中取數據。但是這種做法有一定的弊端,過多的讀請求線程堵塞,將機器內存占滿,依然沒有能夠從根本上解決問題。

2.在並發場景發生前,先手動觸發請求,將緩存都存儲起來,以減少後期請求對database的第一次查詢的壓力。數據過期時間設置盡量分散開來,不要讓數據出現同一時間段出現緩存過期的情況。

3.從緩存可用性的角度來思考,避免緩存出現單點故障的問題,可以結合使用 主從+哨兵的模式來搭建緩存架構,但是這種模式搭建的緩存架構有個弊端,就是無法進行緩存分片,存儲緩存的數據量有限制,因此可以升級為Redis Cluster架構來進行優化處理。(需要結合企業實際的經濟實力,畢竟Redis Cluster的搭建需要更多的機器)

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

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

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

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