快取的目的都是為了減少跟資料庫的直接互動,提高可用性。常用的方法如,對熱點資料快取、對部分資料預載入、對頻繁操作的資料放到快取中操作等等。
在開發的過程中,我嘗試了一種自動處理快取的方法,記錄下,以供參考。
在業務**,和orm之間,引入乙個模組(sasql)。將對於資料庫的操作,分為單行操作、list操作,即讀寫單條記錄,和讀寫多條記錄。
以list為例:
sasql獲取list資料時,優先從快取拿,沒有則通過orm從資料庫拿。核心**示意如下:
//讀取快取
cacheparams :=
&map
[string
]string
if ignorecache ==
false
else}}
//讀取資料庫
if err := session.
find
(aryptr)
; err ==
nilreturn
nil}
else
示例中,sacache則是快取處理,其中,將引數以k_v的形式組合成字串,作為redis快取的key。假如獲取同一張表的list,但是引數不同,則會快取成兩條記錄。
該方案只是快取的補充手段,對於快取數量要有限制,因為同一條資料,可能會出現在多條快取記錄中(因為不同引數都會單獨快取),會出現較多的重複資料,浪費空間。
示例**中,對分頁資料,只快取前2頁資料,就是基於次點考慮。
以下為獲取快取key的示意**:
func
listkey
(tbl string
, params *
map[
string
]string
)(key string
)"_"
+ tbl +
"_list_"
var keyary [
]string
for k :=
range
*params
sort.
strings
(keyary)
for i, k :=
range keyary
}return
}
此方案的優點是,可以應對突發或者意向之外的流量,作為主要快取策略的乙個補充。
再者,每次取資料,都會先走快取,而redis是單執行緒(不考慮最新版本的),對於請求會自動做排隊,也會降低資料庫壓力。
附上基於此方案的壓測結果
仿okhttp快取策略的資料快取
之前在面試中經常被問到看過哪些優秀的原始碼,吧啦吧啦說一大堆,問學到了哪些東西,吧啦吧啦又說一大堆,但是其實都是紙上談兵,並未結合到專案中。比如說okhttp的快取策略,okhttp的快取做的還是不錯的,有快取沒有過期就直接用,有快取過期了先用過期的,然後再聯網儲存,沒有快取再去聯網請求,之前也寫過...
mysql 快取策略 Mysql的快取機制
參考 mysql的快取功能 對於乙個並沒有那麼複雜的系統,但是某幾個表特別大的時候,快取是乙個很實用的乙個功能,是sql優化和查詢提速的常用操作,開啟mysql自帶的此功能,實現查詢結果快取的同時,快取失效的維護由資料庫自己完成,而不像一般的spring框架要通過 或者過期自動超時來維護。當然,這個...
技術 技術方案優化策略 快取層面
兩種快取 什麼情況適合用快取?快取選型 什麼時候更新快取?如何保證更新的可靠性和實時性?更新快取的策略,需要具體問題具體分析。例如,目前約10萬個商品資料採用了redis作為快取服務,具體更新的策略有兩個 快取滿了怎麼辦?快取資料丟失怎麼辦?如果不允許,就需要帶持久化功能的快取服務來支援,比如red...