mysql高并發(fā)數(shù)據(jù)重復 用了緩存了,數(shù)據(jù)庫就沒問題了嗎?
用了緩存了,數(shù)據(jù)庫就沒問題了嗎?當然不是。如果數(shù)據(jù)庫有問題,我們應該根據(jù)系統(tǒng)對數(shù)據(jù)庫的讀寫壓力來決定。通常當用戶達到一定水平后,我們會根據(jù)系統(tǒng)的業(yè)務特點進行相應的技術架構調整和服務器擴展。讓我簡單介紹
用了緩存了,數(shù)據(jù)庫就沒問題了嗎?
當然不是。
如果數(shù)據(jù)庫有問題,我們應該根據(jù)系統(tǒng)對數(shù)據(jù)庫的讀寫壓力來決定。
通常當用戶達到一定水平后,我們會根據(jù)系統(tǒng)的業(yè)務特點進行相應的技術架構調整和服務器擴展。讓我簡單介紹一下常見的中小互聯(lián)網(wǎng)公司的數(shù)據(jù)擴展過程。其過程大致如下:
單實例數(shù)據(jù)庫--->讀寫分離--->緩存服務--->多實例數(shù)據(jù)庫--->多實例緩存--->冷熱分離--->數(shù)據(jù)平臺沉淀--->分布式搜索引擎
當然,這個過程不是很嚴謹,但也很復雜非常粗糙。不同的業(yè)務系統(tǒng)需要不同的拆分和數(shù)據(jù)擴展方法。有些人甚至喜歡使用服務器本身的內存來緩存一些數(shù)據(jù)。這里只是一個簡單的解釋,當系統(tǒng)給數(shù)據(jù)庫帶來壓力時,我們應該繼續(xù)做技術跟進。當然,隨著業(yè)務系統(tǒng)的發(fā)展,技術架構往往是解耦的。技術架構和業(yè)務架構相輔相成。
這里是一個簡單的帖子,提供了一個常見的基本互聯(lián)網(wǎng)架構圖:
如果您對系統(tǒng)架構設計感興趣,請注意或查看我以前的答案。有信息共享。謝謝
有兩種選擇。
讓我們首先了解緩存和數(shù)據(jù)庫數(shù)據(jù)不一致時會發(fā)生什么。查詢數(shù)據(jù)時,優(yōu)先從緩存中獲取數(shù)據(jù)。如果緩存不存在,則查詢數(shù)據(jù)庫并寫入緩存。如果數(shù)據(jù)庫數(shù)據(jù)發(fā)生更改,請清除緩存。在正常情況下,沒有問題。但是,在服務的并發(fā)性非常高的情況下,如果刪除緩存,則在數(shù)據(jù)庫完成數(shù)據(jù)更新之前會有查詢請求。此時,舊數(shù)據(jù)將被讀寫到緩存中。在這種情況下,緩存和數(shù)據(jù)庫不一致。
第一種解決方案:延遲刪除。更改數(shù)據(jù)庫數(shù)據(jù)時,清除緩存的操作會延遲一段時間。這段時間可能很短。它只需要確保數(shù)據(jù)庫寫入操作已完成。但在實際環(huán)境中,我們不知道數(shù)據(jù)庫何時會寫入數(shù)據(jù),所以很難控制這段時間。如果太短,就不行了。如果時間太長,會影響體驗。但總的來說,這種方法可以解決問題。
另一種解決方案是使用數(shù)據(jù)庫的binlog來訂閱binlog。更新數(shù)據(jù)時,該消息用于通知刪除緩存。該方案能保證數(shù)據(jù)庫更新操作的完成和緩存的及時更新。