memcached應用策略(轉)
(2012-04-05 11:10:02)
標簽: memcached應用策略it | 分類: linux_c |
memcached應用策略
memcached 主要的作用是為減輕大訪問量對數據庫的沖擊,所以一般的邏輯是首先從memcached中讀取數據,如果沒有就從數據庫中讀取數據寫入到memcache 中,等下一次讀取的時候就可以從memcached中讀取了。但在項目中的具體應用策略(也就是哪些數據應該緩存?怎么樣緩存?過期策略?)就是個問題了。它的一個總原則是將經常需要從數據庫讀取的數據緩存在memcached中。這些數據也分為幾類:
一、經常被讀取并且實時性要求不強可以等到自動過期的數據。例如門戶網站首頁最新文章列表、某某排行等數據。也就是雖然新數據產生了,但對用戶體驗不會產生任何影響的場景。這類數據就使用典型的緩存策略,設置一過合理的過期時間,當數據過期以后再從數據庫中讀取。當然你得制定一個緩存清除策略,便于編輯或者其它人員能馬上看到效果。
二、經常被讀取并且實時性要求強的數據。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的hash值作為key,結果數組作為值寫入memcached,并且將該SQL涉及的table_name以及hash值配對存入memcached中。當更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
三、統計類緩存,比如文章瀏覽數、網站PV等。此類緩存是將在數據庫的中來累加的數據放在memcached來累加。獲取也通過memcached來獲取。但這樣就產生了一個問題,如果memcached服務器down掉的話這些數據就有可能丟失,所以一般使用memcached的永固性存儲。
四、活躍用戶的基本信息或者某篇熱門文章。此類數據的一個特點就是數據都是一行,也就是一個一維數組,當數據被update時(比如修改昵稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存里的數據。這樣就有效了避免了再次查詢數據庫。
六、session數據,使用memcached來存儲session的效率是最高的。memcached本身也是非常穩定的,不太用擔心它會突然down掉引起session數據的丟失,即使丟失就重新登錄了,也沒啥。
總結,通過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用memcached是否得當的方法是查看memcached的命中率,有些策略好的網站的命中率可以到達到90%以上。
根據以往經驗,在C++開發的服務器上,一般MC應用在以下兩種情況:
讀寫比4:1以上的場景更為恰當,也就是說讀頻率要高于寫頻率越多使用MC進行緩存就越好。
不需要寫庫內容,變化頻率很高,但不需要記錄,如用戶的狀態等,降低數據庫寫壓力。
不需要及時寫庫的內容,變化頻率很高,間隔一定時間后把最新的數據寫入數據庫,降低數據庫寫壓力。
memcached 主要的作用是為減輕大訪問量對數據庫的沖擊,所以一般的邏輯是首先從memcached中讀取數據,如果沒有就從數據庫中讀取數據寫入到memcache 中,等下一次讀取的時候就可以從memcached中讀取了。但在項目中的具體應用策略(也就是哪些數據應該緩存?怎么樣緩存?過期策略?)就是個問題了。它的一個總原則是將經常需要從數據庫讀取的數據緩存在memcached中。這些數據也分為幾類:
一、經常被讀取并且實時性要求不強可以等到自動過期的數據。例如門戶網站首頁最新文章列表、某某排行等數據。也就是雖然新數據產生了,但對用戶體驗不會產生任何影響的場景。這類數據就使用典型的緩存策略,設置一過合理的過期時間,當數據過期以后再從數據庫中讀取。當然你得制定一個緩存清除策略,便于編輯或者其它人員能馬上看到效果。
二、經常被讀取并且實時性要求強的數據。比如用戶的好友列表,用戶文章列表,用戶閱讀記錄等。這類數據首先被載入到memcached中,當發生更改(添加、修改、刪除)時就清除緩存。在緩存的時候,我將查詢的SQL語句md5()得到它的hash值作為key,結果數組作為值寫入memcached,并且將該SQL涉及的table_name以及hash值配對存入memcached中。當更改了這個表時,我就將與此表相配對的key的緩存全部刪除。
三、統計類緩存,比如文章瀏覽數、網站PV等。此類緩存是將在數據庫的中來累加的數據放在memcached來累加。獲取也通過memcached來獲取。但這樣就產生了一個問題,如果memcached服務器down掉的話這些數據就有可能丟失,所以一般使用memcached的永固性存儲。
四、活躍用戶的基本信息或者某篇熱門文章。此類數據的一個特點就是數據都是一行,也就是一個一維數組,當數據被update時(比如修改昵稱、文章的評論數),在更改數據庫數據的同時,使用Memcache::replace替換掉緩存里的數據。這樣就有效了避免了再次查詢數據庫。
六、session數據,使用memcached來存儲session的效率是最高的。memcached本身也是非常穩定的,不太用擔心它會突然down掉引起session數據的丟失,即使丟失就重新登錄了,也沒啥。
總結,通過以上的策略數據庫的壓力將會被大大減輕。檢驗你使用memcached是否得當的方法是查看memcached的命中率,有些策略好的網站的命中率可以到達到90%以上。
根據以往經驗,在C++開發的服務器上,一般MC應用在以下兩種情況:
讀寫比4:1以上的場景更為恰當,也就是說讀頻率要高于寫頻率越多使用MC進行緩存就越好。
不需要寫庫內容,變化頻率很高,但不需要記錄,如用戶的狀態等,降低數據庫寫壓力。
不需要及時寫庫的內容,變化頻率很高,間隔一定時間后把最新的數據寫入數據庫,降低數據庫寫壓力。