本答應大家這一篇文章講解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都采用這樣的分布式緩存,分布式緩存對數據實時性比較高的項目是怎么適合!
(注:數據庫讀寫分離也可以解決高並發問題,但是超高並發是不行的,向雙十一這種,要用到分布式緩存了)