memcache,redis分布式緩存詳解


本答應大家這一篇文章講解AutoMapper,但是為了滿足旁邊同事小法師的強烈要求,就先寫一篇關於分布式緩存的文章吧。

一、

問題一:為什么要有分布式緩存?什么時候用分布式緩存?

答:舉個例子,當你的網站隨着業務的擴大,訪問量會很大,很有可能在同一時間有幾個人,共同操作一條數據,但是數據庫

鎖機制,有可能會造成死鎖,簡單點就是服務器卡死,宕機(cpu 100%)!先普及一下數據庫鎖機制:

select * from table1//此時會給這個表加上S鎖(共享鎖)

update table1 set colum="somedata" //此時給table1加上X鎖
T1:
begin tran
select * from table (holdlock) (holdlock意思是加共享鎖,直到事物結束才釋放)
update table set column1='hello'

T2:
begin tran
select * from table(holdlock)
update table set column1='world'

假設T1和T2同時達到select,T1對table加共享鎖,T2也對加共享鎖,當
T1的select執行完,准備執行update時,根據鎖機制,T1的共享鎖需要升
級到排他鎖才能執行接下來的update.在升級排他鎖前,必須等table上的
其它共享鎖釋放,但因為holdlock這樣的共享鎖只有等事務結束后才釋放,
所以因為T2的共享鎖不釋放而導致T1等(等T2釋放共享鎖,自己好升級成排
他鎖),同理,也因為T1的共享鎖不釋放而導致T2等。死鎖產生了。
 

一個表上可以有很多個s鎖,但是一個表上只會有一個X鎖存在,也就是說,在Update的時候這條數據只能被一個用戶使用,別人是無法查詢或者修改的。

隨着訪問量的增大,並發幾率就會增高,所謂並發就是同意時間操作同一個數據。

因為讀取數據庫是通過磁盤讀取的,磁盤的讀取速度和內存的讀取速度是沒法比的,此時就可以使用memcache或者redis來解決這個問題。

 

二、memcache和redis的區別

小僧自己認為主要區別有以下幾點:

1、最主要的就是redis支持數據持久化,mm不支持。

2. mm是多線程的,redis是單線程運作。

3.redis支持的數據類型比較多(隊列),而mm只支持key-value.

具體的配置信息,大家可以去別的博客拷貝,不用記,用的時候直接復制粘貼

三、重點是redis、mm怎么和當前的數據庫信息進行同步,實際開發中是怎么運用的?

額 這個問題需要畫一張圖來解釋一下了 

 

下面詳細講解一下開發過程:

     1.客戶端的查詢語句邏輯:先查詢緩存中有沒有需要的數據,如果沒有,就查詢數據庫

if(getdata())
{
showdata()
}

else { sqltodata(); showdata(); }

 2.客戶端的修改操作邏輯:先修改緩存中的數據,再將update語句寫入緩存redis的隊列中(這樣就能保證用戶修改數據后能夠直接看到修改的數據),

后台處理程序就會去抓取隊列中的sql語句執行,這樣就解決的高並發。修改的就不上代碼了 。

(代碼略,太簡單)

3.客戶端刪除操作邏輯:先刪除數據庫,再刪除緩存(這樣做的優點是:確認數據庫沒有數據了才刪除緩存,數據的准確性)。

(代碼略,太簡單)

 

同樣分布式緩存最集群讀寫分離也是很方便的memcache是通過客戶端配置,而redis是通過服務器端配置。

這樣整個項目的CRUD都采用這樣的分布式緩存,分布式緩存對數據實時性比較高的項目是怎么適合!

(注:數據庫讀寫分離也可以解決高並發問題,但是超高並發是不行的,向雙十一這種,要用到分布式緩存了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM