程序员修神之路--高并发下为什么更喜欢进程内缓存
菜菜哥,告訴你一個(gè)好消息
YY妹子,什么好消息,你有男票了?
不是啦,我做的一個(gè)網(wǎng)站,以前經(jīng)常由于訪問(wèn)量太大而崩潰,現(xiàn)在我加上了緩存,很穩(wěn)定啦
加的什么緩存呢?
我用的redis,號(hào)稱業(yè)界最快的緩存組件了
你覺(jué)得現(xiàn)在的緩存操作應(yīng)該是最快的了嗎?
是的,我覺(jué)得沒(méi)有緩存能比這種模式更快了
你先停停,我給你先講個(gè)故事
進(jìn)程內(nèi)緩存是指緩存和應(yīng)用程序在相同地址空間。即同一個(gè)進(jìn)程內(nèi)。分布式緩存是指緩存和應(yīng)用程序位于不同進(jìn)程的緩存,通常部署在不同服務(wù)器上。
????????從前有個(gè)機(jī)構(gòu),機(jī)構(gòu)的主人叫做 CPU,這個(gè)機(jī)構(gòu)專門派仆人取一些東西然后做相應(yīng)的處理。下面是這個(gè)機(jī)構(gòu)日常的場(chǎng)景。
cpu
趕緊去我的倉(cāng)庫(kù)L1緩存取點(diǎn)東西
仆人
主人你要的東西,那里離我們最近,所以很快,但是空間比較小。
cpu
你丫還挺快,只用了大約一秒
cpu
趕緊去倉(cāng)庫(kù) L2緩存取點(diǎn)東西
仆人
主人你要的東西,那里離我們也很近,比L1緩存遠(yuǎn)一點(diǎn),但是也很快,空間比較小,但是比L1緩存的空間大。
cpu
速度還可以,大約20秒就回來(lái)了
cpu
街上有一個(gè)地方叫內(nèi)存,趕緊去取點(diǎn)東西
仆人
主人你要的東西,內(nèi)存這個(gè)地方空間很大呀,就是稍微遠(yuǎn)了點(diǎn)
cpu
居然用了5分鐘,等你這段時(shí)間我都刷了好幾個(gè)段子了
cpu
有一個(gè)叫做磁盤的小鎮(zhèn),趕緊去取點(diǎn)東西
仆人
主人你要的東西,磁盤這個(gè)地方空間太大呀,取點(diǎn)東西很慢呀
cpu
居然用了5天,等你這段時(shí)間我都能抱團(tuán)來(lái)一個(gè)周邊游了
cpu
有一個(gè)叫做互聯(lián)網(wǎng)的國(guó)度,趕緊去取點(diǎn)東西
仆人
主人你要的東西,互聯(lián)網(wǎng)太遠(yuǎn)了,取點(diǎn)東西太費(fèi)勁了
cpu
居然用了15天,等你去互聯(lián)網(wǎng)取東西,簡(jiǎn)直就是在浪費(fèi)我的生命
cpu當(dāng)我做完一個(gè)委托人的任務(wù),切換到另外一個(gè)委托人的任務(wù)時(shí)候,我需要把上一個(gè)委托人的一些信息先記錄下來(lái),然后還需要把新委托人的信息讀取一遍,這個(gè)過(guò)程我是很耗時(shí)的,大約需要一個(gè)小時(shí)呢
以上故事純屬預(yù)估數(shù)據(jù),真實(shí)數(shù)據(jù)會(huì)根據(jù)不同的硬件配置和網(wǎng)絡(luò)環(huán)境有誤差。????????通過(guò)以上不正經(jīng)的小故事,我們可以了解到cpu取各個(gè)設(shè)備數(shù)據(jù)的大體差距。至于YY妹子的問(wèn)題,大家也應(yīng)該了解了。
1.? 首先把數(shù)據(jù)從磁盤加載到內(nèi)存做緩存,這個(gè)是對(duì)的。畢竟磁盤的IO速度比內(nèi)存要慢的多。就拿我們現(xiàn)在使用的大多數(shù)PC機(jī)以及服務(wù)器來(lái)說(shuō),磁盤往往是性能的瓶頸。
2.? 如果有條件或者框架支持可以實(shí)現(xiàn)進(jìn)程內(nèi)緩存,我還是推薦使用進(jìn)程內(nèi)緩存,畢竟類似Redis這樣的kv存儲(chǔ)和應(yīng)用程序多數(shù)情況不在一臺(tái)服務(wù)器上,雖然局域網(wǎng)的速度肉眼看起來(lái)非常快,但是對(duì)于cpu來(lái)講,還是讓cpu休了一個(gè)大假。
????至于什么情況下適合應(yīng)用進(jìn)程內(nèi)緩存,我覺(jué)得有幾點(diǎn)需要注意:
1.? 相同的請(qǐng)求或者設(shè)置的相同緩存key的請(qǐng)求每次都是同一個(gè)服務(wù)器上的同一個(gè)程序去處理,這樣這個(gè)請(qǐng)求的緩存正常情況下只會(huì)產(chǎn)生一份。 如果每次請(qǐng)求都會(huì)路由到不同的服務(wù)器,便會(huì)產(chǎn)生多個(gè)緩存的副本,維護(hù)這些緩存數(shù)據(jù)的一致性是需要代價(jià)的。
2.? 當(dāng)有新的服務(wù)器節(jié)點(diǎn)加入或者服務(wù)器節(jié)點(diǎn)退出的時(shí)候,不能發(fā)生雪崩現(xiàn)象,所有緩存請(qǐng)求都穿透到達(dá)數(shù)據(jù)庫(kù),那是比較要命的。比如可以看一下菜菜以前的文章:分布式緩存的一條明路(附代碼)
3.? 如果緩存的處理服務(wù)器發(fā)生變化,比如:由于某種原因,開(kāi)始請(qǐng)求是由服務(wù)器A來(lái)處理,后來(lái)A服務(wù)器down了,現(xiàn)在由服務(wù)器B來(lái)處理,在緩存轉(zhuǎn)移的過(guò)程中,必須能保證數(shù)據(jù)的正確性和一致性。
4.? 程序的進(jìn)程內(nèi)緩存必須有過(guò)期策略,在有限內(nèi)存大小的情況下,合理的使用。推薦使用LRU淘汰算法來(lái)保證內(nèi)存不會(huì)撐爆。
5.? 系統(tǒng)的并發(fā)量及其大,對(duì)性能的要求及其高,可以考慮使用進(jìn)程內(nèi)緩存。
6.? 如果是小部分只讀數(shù)據(jù),并且訪問(wèn)量比較大,例如經(jīng)常使用的字典數(shù)據(jù)等,可以考慮使用進(jìn)程內(nèi)緩存。
????相對(duì)于分布式緩存,比如Redis,進(jìn)程內(nèi)緩存有哪些優(yōu)勢(shì)呢?
1.? 進(jìn)程內(nèi)緩存性能比較高,延遲會(huì)更小,更節(jié)省帶寬,畢竟分布式緩存網(wǎng)絡(luò)調(diào)用的性能和本地調(diào)用比起來(lái)慢太多,
2.? 由于和應(yīng)用程序位于同一進(jìn)程,共享相同的虛擬內(nèi)存,所以在狀態(tài)維護(hù)上更容易一些,
3.? 其次進(jìn)程內(nèi)的緩存不設(shè)計(jì)到網(wǎng)絡(luò)傳輸,所以沒(méi)有序列化的過(guò)程,在性能上更勝一籌。
4.? 進(jìn)程內(nèi)緩存的數(shù)據(jù)類型幾乎可以是語(yǔ)言級(jí)別支持的任意類型,數(shù)據(jù)類型設(shè)計(jì)上比大多數(shù)分布式緩存設(shè)備支持要靈活許多。
????????在應(yīng)對(duì)高并發(fā)的情況下,如果有適當(dāng)?shù)沫h(huán)境菜菜還是覺(jué)得進(jìn)程內(nèi)緩存為首選,另外一點(diǎn)程序要盡量避免線程切換,盡量異步化。如果可以最好能預(yù)估出緩存數(shù)據(jù)的大小,避免內(nèi)存泄漏等現(xiàn)象發(fā)生。
????????當(dāng)然分布式緩存有自己的優(yōu)勢(shì),在監(jiān)控,容災(zāi),擴(kuò)展性,易用性等方面更勝一籌。至于用進(jìn)程內(nèi)還是分布式緩存,沒(méi)有定論,能解決業(yè)務(wù)痛點(diǎn)就是最好的結(jié)果
程序如果要想最大程度的提升并發(fā)量,縮短響應(yīng)時(shí)間, 就把用戶需要的數(shù)據(jù)放在離用戶最近的地方
總結(jié)
以上是生活随笔為你收集整理的程序员修神之路--高并发下为什么更喜欢进程内缓存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET Core 3中的性能提升(译文
- 下一篇: 怎样学习和阅读技术书籍?