快取為何出現及演變過程

2021-09-24 04:24:50 字數 768 閱讀 7699

本篇主要是個人的一些感受。在沒有快取之前,高併發下所有的請求都會直接懟到資料庫,如mysql上。如果伺服器是機械硬碟,則mysql的併發請求也就在300左右,如果是固態硬碟則是700左右就已經不錯了。如果併發量再大一點,mysql就會丟擲異常,too many connections ,也就是資料庫癱瘓了。

快取此時應運而生,快取作為資料庫的屏障,可以先擋下大部分請求。以redis快取為例,我們可以先從快取中取資料,如果取不到,則查詢資料庫,然後將查詢的資料再次放入redis。這裡涉及乙個問題是資料的同步性,如果資料庫的資料變了,如果更新快取,有三種方法

1.強一致性,通過aop或快取工具類實現,每次更新資料庫,手動更新快取,缺點是耦合性大

2.準一致性,訊息佇列實現

3 弱一致性,將快取設定有效期,失效後,重新查詢資料庫,優點是簡單,無耦合

方案3會引入另乙個問題,快取雪崩,如果大量的key同一時間失效,還是會有很多請求懟到資料庫,依然會癱瘓,首先想到的是加鎖,建議用lock鎖,加鎖之後,資料庫不會癱瘓,但是吞吐量會下降很多。比如一萬個請求去競爭一把鎖,那如何才能提高效率呢?我們可以多設定幾把鎖,我們維護乙個concurrenthashmap ,不用hashmap是因為執行緒不安全。 concurrenthashmap類似乙個這樣的介面,map的key為我們的請求引數,這個需要我們根據實際場景去定義,比如一張表存有全中國人的工資,我們查詢每個中國人的工資,可以將省份作為key,這樣我們就有34把鎖,因為是34個省份。也可以將性別作為key,只有兩把鎖這樣。這樣我們就可以提高吞吐量。

修改ThinkPHP快取為Memcache的方法

一般來說,thinkphp的預設快取方式是以file檔案方式實現的,執行時會在 runtime temp 下生成很多的快取檔案。有的情況下伺服器裝了memcached之後,需要將thinkphp的快取方式更改成memecache方式 具體操作步驟如下 在conf config.php 中新增 dat...

匯出檔案時出現另存為框

這個是 servlet中的乙個方法public string antidataexport httpservletrequest request,httpservletresponse response throws exception listdataset new arraylist datas...

快取雪崩,快取穿透,快取擊穿出現的原因及解決方案

出現過程 假設有如下乙個系統,高峰期請求為5000次 秒,4000次走了快取,只有1000次落到了資料庫上,資料庫每秒1000的併發是乙個正常的指標,完全可以正常工作,但如果快取宕機了,或者快取設定了相同的過期時間,導致快取在同一時刻同時失效,每秒5000次的請求會全部落到資料庫上,資料庫立馬就死掉...