解決緩存和數據庫數據同步問題。
1.緩存的使用方式
讀數據
:先讀取緩存,若不存在則從DB中讀取,並將結果寫入到緩存中;下次數據讀取時便可以直接從緩存中獲取數據。
改數據
:直接失效緩存數據,再修改DB內容(避免突發情況:避免DB修改成功,但由於網絡或者其他問題導致緩存數據沒有清理,造成了臟數據)
deleteAndIncVersion
接口:此接口並不會真的刪除數據,而是給數據打了標簽,表明已失效狀態,並且增加數據版本號;如果數據不存在則寫入NULL,同時也生成隨機數據版本號。OCS寫入支持原子對比版本號:假設傳入的版本號與OCS保存的數據版本號一致或者原數據不存在,則准許寫入,否則拒絕修改。
2.緩存與數據庫的一致性
方案
:MySQL作為主庫(寫),Redis作為高速數據查詢(讀)從庫的異構讀寫分離。
解決:專門開發了自己的MySQL復制工具,可以方便的實時同步MySQL中的數據到Redis上。
如果你可以接受定期從redis導入到mysql,那基本上表示你的業務就不需要mysql。
至於緩存,一般都是讀緩存(寫緩存實現起來很羅嗦,而且也不那么靠譜),與數據庫的同步策略需要添加到自己的代碼邏輯里。
結論:寫操作不緩存。失效緩存數據,再修改DB內容。
其他想法:
首先更新到 Mysql,然后再根據Mysql的更新內容去更新 其他數據庫例如redis。有一個問題很明顯,就是高並發下寫入Mysql是個可怕的事情,所以我之前想到的是直接更新redis然后異步更新Mysql,最后將redis作為緩沖層。
結論:高並發寫的情況必須單獨特殊處理(直接內存操作,慢回寫數據庫)。比如第4節:追求響應速度的情況。
3.多IDC的情況下的緩存一致性
不一致的根本原因是異構系統之間無法協同同步,不能保證DB數據先同步,緩存數據后同步。
所以就要考慮緩存系統如何等待DB同步,或者能否做到兩者共用一套同步機制?緩存同步也依賴DB BINLOG是一個可行的方案。
4.追求響應速度的情況
如果用關系數據庫,大量讀寫會導致索引無效,讀寫效率都會比較低下。可以考慮僅僅把那種一旦丟失就影響很大如當前等級、帳號和密碼之類的才持久化保存到關系數據庫中。
其他的實時數據,可以考慮使用各種NOSQL方案來達成更高的性能
,或者干脆自己的前端程序在內存中折騰,10分鍾才回寫給數據庫行不行呢。
假如非得用關系數據庫不可,建議采用內存數據庫。
如果沒有內存數據庫可用,可以考慮加大機器內存,反正現在內存也便宜,把各種緩存啊SharedBuffer之類的都開得盡可能的大。 還可以考慮上固態硬盤,提高磁盤I/O速度。
再者,就是考慮看能否把數據分離到不同的各個節點,盡量減少單點處理壓力。
