自動快取 對快取策略的補充方案

2021-10-04 00:07:19 字數 2347 閱讀 3745

快取的目的都是為了減少跟資料庫的直接互動,提高可用性。常用的方法如,對熱點資料快取、對部分資料預載入、對頻繁操作的資料放到快取中操作等等。

在開發的過程中,我嘗試了一種自動處理快取的方法,記錄下,以供參考。

在業務**,和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...