GoFrame 框架緩存查詢結(jié)果的示例詳解
后續(xù)幾篇文章再接再厲,仍然為大家介紹GoFrame框架緩存相關(guān)的知識點,以及自己項目使用中的一些總結(jié)思考,GoFrame框架下文簡稱gf。
今天重點為大家介紹:GoFrame 如何優(yōu)雅的緩存查詢結(jié)果
查詢緩存
gdb
支持對查詢結(jié)果的緩存處理,常用于多讀少寫的查詢緩存場景,并支持手動的緩存清理。
需要注意的是,查詢緩存僅支持鏈?zhǔn)讲僮?,且在事?wù)操作下不可用。
相關(guān)方法:
func (m *Model) Cache(duration time.Duration, name ... string) *Model
- 重要提醒:事務(wù)查詢是不支持緩存的。
- 當(dāng)duration < 0時表示清除緩存, duration=0時表示不過期, duration > 0時表示過期時間,duration過期時間單位:秒;
- name表示自定義的緩存名稱,便于業(yè)務(wù)層精準(zhǔn)定位緩存項(如果業(yè)務(wù)層需要手動清理時,必須指定緩存名稱)
緩存對象
ORM
對象默認情況下提供了緩存管理對象,該緩存對象類型為*gcache.Cache
,也就是說同時也支持*gcache.Cache
的所有特性。
可以通過GetCache() *gcache.Cache
接口方法獲得該緩存對象,并通過返回的對象實現(xiàn)自定義的各種緩存操作,例如:g.DB().GetCache().Keys()
。
緩存適配(Redis緩存)
默認情況下ORM
的*gcache.Cache
緩存對象提供的是單進程內(nèi)存緩存,雖然性能非常高效,但是只能在單進程內(nèi)使用。
如果服務(wù)采用多節(jié)點部署,多節(jié)點之間的緩存可能會產(chǎn)生數(shù)據(jù)不一致的情況,因此大多數(shù)場景下我們都是通過Redis
服務(wù)器來實現(xiàn)對數(shù)據(jù)庫查詢數(shù)據(jù)的緩存。
*gcache.Cache
對象采用了適配器設(shè)計模式,可以輕松實現(xiàn)從單進程內(nèi)存緩存切換為分布式的Redis
緩存。
示例代碼如下,是不是非常優(yōu)雅:
adapter := adapter.NewRedis(g.Redis()) g.DB().GetCache().SetAdapter(adapter)
Redis
的緩存是基于查詢SQL
作為鍵名,查詢結(jié)果作為鍵值。
通過Cache
鏈?zhǔn)椒椒▽彺娴膶懭牒颓宄挤浅1憬荨?/p>
使用示例
數(shù)據(jù)表結(jié)構(gòu)
CREATE TABLE `user` ( `uid` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL DEFAULT '' COMMENT '昵稱', `site` varchar(255) NOT NULL DEFAULT '' COMMENT '網(wǎng)站', PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
示例代碼
package main import ( "github.com/gogf/gf/database/gdb" "github.com/gogf/gf/frame/g" "time" ) func main() { db := g.DB() // 開啟調(diào)試模式,以便于記錄所有執(zhí)行的SQL db.SetDebug(true) // 執(zhí)行2次查詢并將查詢結(jié)果緩存1小時,并可執(zhí)行緩存名稱(可選) for i := 0; i < 2; i++ { r, _ := db.Table("user").Cache(time.Hour, "test-user").Where("uid", 1).One() g.Log().Print(r.Map()) } // 執(zhí)行更新操作,并清理指定名稱的查詢緩存 _, err := db.Table("user").Cache(-1, "test-user").Data(gdb.Map{"name": "海賊王"}).Where("uid", 1).Update() if err != nil { g.Log().Fatal(err) } // 再次執(zhí)行查詢,啟用查詢緩存特性 r, _ := db.Table("user").Cache(time.Hour, "test-user").Where("uid", 1).One() g.Log().Print(r.Map()) }
執(zhí)行后輸出結(jié)果為(測試表數(shù)據(jù)結(jié)構(gòu)僅供示例參考):
2022-06-15 21:44:12.228 [DEBU] [1 ms] SELECT * FROM `user` WHERE uid=1 LIMIT 1
2022-06-15 21:44:12.228 {"name":"王中陽","site":"https://juejin.cn/user/2189882892232029","uid":1}
2022-06-15 21:44:12.228 {"name":"王中陽","site":"https://juejin.cn/user/2189882892232029","uid":1}
2022-06-15 21:44:12.299 [DEBU] [1 ms] UPDATE `user` SET `name`='海賊王' WHERE uid=1
2022-06-15 21:44:12.300 [DEBU] [1 ms] SELECT * FROM `user` WHERE uid=1 LIMIT 1
2022-06-15 21:44:12.300 {"name":"海賊王","site":"https://juejin.cn/user/2189882892232029","uid":1}
小技巧
為了方便展示緩存效果,這里開啟了數(shù)據(jù)debug
特性,當(dāng)有任何的SQL操作時將會輸出到終端。
運行結(jié)果分析
- 執(zhí)行兩次
One
方法數(shù)據(jù)查詢,第一次走了SQL查詢,第二次直接使用到了緩存,SQL沒有提交到數(shù)據(jù)庫執(zhí)行,因此這里只打印了一條查詢SQL,并且兩次查詢的結(jié)果也是一致的。 - 注意這里為該查詢的緩存設(shè)置了一個自定義的名稱
test-user
,以便于后續(xù)清空更新緩存。如果緩存不需要清理,那么可以不用設(shè)置緩存名稱。 - 當(dāng)執(zhí)行
Update
更新操作時,同時根據(jù)名稱清空指定的緩存。 - 隨后再執(zhí)行
One
方法數(shù)據(jù)查詢,這時重新緩存新的數(shù)據(jù)。
總結(jié)
GoFrame的gdb
對查詢結(jié)果的緩存處理是不是非常的優(yōu)雅。尤其是*gcache.Cache
對象采用了適配器設(shè)計模式,可以輕松實現(xiàn)從單進程內(nèi)存緩存切換為分布式的Redis
緩存。
到此這篇關(guān)于GoFrame 如何優(yōu)雅的緩存查詢結(jié)果的文章就介紹到這了,更多相關(guān)GoFrame 緩存查詢結(jié)果內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學(xué)習(xí)Golang,發(fā)現(xiàn)了一個問題,覺著有必要給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Golang map如何生成有序json數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-07-07Go?channel實現(xiàn)批量讀取數(shù)據(jù)
Go中的?channel?其實并沒有提供批量讀取數(shù)據(jù)的方法,需要我們自己實現(xiàn)一個,使用本文就來為大家大家介紹一下如何通過Go?channel實現(xiàn)批量讀取數(shù)據(jù)吧2023-12-12go?zero微服務(wù)實戰(zhàn)系服務(wù)拆分
這篇文章主要為大家介紹了go?zero微服務(wù)實戰(zhàn)系服務(wù)拆分的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Go語言基礎(chǔ)學(xué)習(xí)之Context的使用詳解
在Go語言中,Context是一個非常重要的概念,它用于在不同的?goroutine?之間傳遞請求域的相關(guān)數(shù)據(jù),本文將深入探討Go語言中?Context特性和Context的高級使用方法,希望對大家有所幫助2023-05-05再次探討go實現(xiàn)無限 buffer 的 channel方法
我們知道go語言內(nèi)置的channel緩沖大小是有上限的,那么我們自己如何實現(xiàn)一個無限 buffer 的 channel呢?今天通過本文給大家分享go實現(xiàn)無限 buffer 的 channel方法,感興趣的朋友一起看看吧2021-06-06