日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gin go 更新缓存_golang自动缓存-对缓存策略的补充方案

發布時間:2024/1/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gin go 更新缓存_golang自动缓存-对缓存策略的补充方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

緩存的目的都是為了減少跟數據庫的直接交互,提高可用性。常用的方法如,對熱點數據緩存、對部分數據預加載、對頻繁操作的數據放到緩存中操作等等。

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

在業務代碼,和ORM之間,引入一個模塊(SaSql)。將對于數據庫的操作,分為單行操作、list操作,即讀寫單條記錄,和讀寫多條記錄。

以list為例:

SaSql獲取list數據時,優先從緩存拿,沒有則通過ORM從數據庫拿。核心代碼示意如下:

//讀取緩存

cacheParams := &map[string]string{}

if ignoreCache == false {

saData.Merge(cacheParams, pk)

saData.Merge(cacheParams, ma)

if err = saCache.ListGet(tblName, cacheParams, aryPtr); err == nil && aryPtr != nil {

return nil

} else {

if onlyCache {

return err

}

}

}

//讀取數據庫

if err := session.Find(aryPtr); err == nil {

//寫入緩存

if ignoreCache == false {

saCache.ListSet(tblName, cacheParams, aryPtr)

}

return nil

} else {

return err

}

示例中,saCache則是緩存處理,其中,將參數以k_v的形式組合成字符串,作為Redis緩存的key。假如獲取同一張表的list,但是參數不同,則會緩存成兩條記錄。

該方案只是緩存的補充手段,對于緩存數量要有限制,因為同一條數據,可能會出現在多條緩存記錄中(因為不同參數都會單獨緩存),會出現較多的重復數據,浪費空間。

示例代碼中,對分頁數據,只緩存前2頁數據,就是基于次點考慮。

以下為獲取緩存Key的示意代碼:

func listKey(tbl string, params *map[string]string) (key string) {

if tbl == "" || params == nil {

return ""

}

key = revel.AppName + "_" + tbl + "_list_"

var keyAry []string

for k := range *params {

keyAry = append(keyAry, k)

}

sort.Strings(keyAry)

for i, k := range keyAry {

key += saUtils.SnakeStr(k) + "=" + (*params)[k]

if i+1 < len(keyAry) {

key += "_"

}

}

return

}

此方案的優點是,可以應對突發或者意向之外的流量,作為主要緩存策略的一個補充。

再者,每次取數據,都會先走緩存,而Redis是單線程(不考慮最新版本的),對于請求會自動做排隊,也會降低數據庫壓力。

附上基于此方案的壓測結果

Server Software:

Server Hostname: xxx

Server Port: 443

SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128

Document Path: xxx

Document Length: 23 bytes

Concurrency Level: 100

Time taken for tests: 484.310 seconds

Complete requests: 250000

Failed requests: 1

(Connect: 0, Receive: 0, Length: 1, Exceptions: 0)

Write errors: 0

Non-2xx responses: 249999

Total transferred: 155999376 bytes

HTML transferred: 5749977 bytes

Requests per second: 516.20 [#/sec] (mean)

Time per request: 193.724 [ms] (mean)

Time per request: 1.937 [ms] (mean, across all concurrent requests)

Transfer rate: 314.56 [Kbytes/sec] received

最后安利一個自己寫的小程序,不喜請忽略

歡迎加微信交流 yf_good134

心悅Lite.jpg

有疑問加站長微信聯系(非本文作者)

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的gin go 更新缓存_golang自动缓存-对缓存策略的补充方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。