您好,登錄后才能下訂單哦!
這篇文章主要介紹了GoFrame gredis怎么緩存DoVar Conn連接對(duì)象實(shí)現(xiàn)自動(dòng)序列化的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇GoFrame gredis怎么緩存DoVar Conn連接對(duì)象實(shí)現(xiàn)自動(dòng)序列化文章都會(huì)有所收獲,下面我們一起來看看吧。
Redis客戶端由gredis
模塊實(shí)現(xiàn),底層采用了鏈接池設(shè)計(jì)。
gredis
使用了連接池來進(jìn)行Redis
連接管理,通過Config
配置對(duì)象或者Set*
方法可以對(duì)連接池的屬性進(jìn)行管理,通過Stats
方法可以獲取連接池的統(tǒng)計(jì)信息。
我們最常用的是Do/DoVar
方法,執(zhí)行同步指令,通過向Redis Server
發(fā)送對(duì)應(yīng)的Redis API
命令,來使用Redis Server
的服務(wù)。Do/Var
方法最大的特點(diǎn)是內(nèi)部自行從連接池中獲取連接對(duì)象,使用完畢后自動(dòng)丟回連接池中,開發(fā)者無需手動(dòng)調(diào)用Close
方法,方便使用。
Do/DoVar
方法我們最常用的是Do/DoVar
方法,執(zhí)行同步指令,通過向Redis Server
發(fā)送對(duì)應(yīng)的Redis API
命令,來使用Redis Server
的服務(wù)。
Do/Var
方法最大的特點(diǎn)是內(nèi)部自行從連接池中獲取連接對(duì)象,使用完畢后自動(dòng)丟回連接池中,開發(fā)者無需手動(dòng)調(diào)用Close
方法,方便使用。
Do
和DoVar
的區(qū)別在于返回的結(jié)果類型不一樣,DoVar
返回的是gvar.Var
類型,該類型對(duì)象可以執(zhí)行非常方便的類型轉(zhuǎn)換。
package main import ( "fmt" "github.com/gogf/gf/frame/g" ) func main() { g.Redis().Do("SET", "k", "v") v, _ := g.Redis().DoVar("GET", "k") fmt.Println(v.String()) }
HSET/HGETALL
操作Hset 命令用于為哈希表中的字段賦值 。
如果哈希表不存在,一個(gè)新的哈希表被創(chuàng)建并進(jìn)行 HSET 操作。
如果字段已經(jīng)存在于哈希表中,舊值將被覆蓋。
package main import ( "fmt" "github.com/gogf/gf/container/gvar" "github.com/gogf/gf/frame/g" ) func main() { var ( err error result *gvar.Var key = "user" ) _, err = g.Redis().Do("HSET", key, "id", 10000) if err != nil { panic(err) } _, err = g.Redis().Do("HSET", key, "name", "王中陽") if err != nil { panic(err) } result, err = g.Redis().DoVar("HGETALL", key) if err != nil { panic(err) } fmt.Println(result.Map()) //打印結(jié)果: map[id:10000 name:王中陽] }
HMSET/HMGET
操作強(qiáng)烈推薦,非常好用:我們可以通過map
參數(shù)執(zhí)行HMSET
操作。
package main import ( "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gutil" ) func main() { var ( key = "user_100" data = g.Map{ "name": "王中陽", "sex": 0, "score": 100, } ) _, err := g.Redis().Do("HMSET", append(g.Slice{key}, gutil.MapToSlice(data)...)...) if err != nil { g.Log().Fatal(err) } v, err := g.Redis().DoVar("HMGET", key, "name") if err != nil { g.Log().Fatal(err) } fmt.Println(v.Slice()) //打印結(jié)果 [王中陽] }
我們也可以通過struct
參數(shù)執(zhí)行HMSET
操作。
package main import ( "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gutil" ) func main() { type User struct { Name string `json:"name"` Sex int `json:"sex"` Score int `json:"score"` } var ( key = "user_100" data = &User{ Name: "王中陽", Sex: 0, Score: 100, } ) _, err := g.Redis().Do("HMSET", append(g.Slice{key}, gutil.StructToSlice(data)...)...) if err != nil { g.Log().Fatal(err) } v, err := g.Redis().DoVar("HMGET", key, "name") if err != nil { g.Log().Fatal(err) } fmt.Println(v.Slice()) //打印結(jié)果: [王中陽] }
Conn
連接對(duì)象使用Do/DoVar
方法已經(jīng)能夠滿足絕大部分的場(chǎng)景需要,如果需要更復(fù)雜的Redis操作,我們可以使用Conn
方法從連接池中獲取一個(gè)連接對(duì)象,隨后使用該連接對(duì)象進(jìn)行操作。
需要注意的是,該連接對(duì)象不再使用時(shí),應(yīng)當(dāng)顯式調(diào)用Close
方法進(jìn)行關(guān)閉(丟回連接池)。
由于該Conn
是個(gè)連接對(duì)象,注意該對(duì)象存在連接超時(shí)的限制,超時(shí)和服務(wù)端配置有關(guān)。
package main import ( "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gconv" ) func main() { conn := g.Redis().Conn() defer conn.Close() conn.Do("SET", "k", "v") v, _ := conn.Do("GET", "k") fmt.Println(gconv.String(v)) //打印結(jié)果:v }
Send
批量指令Send
可以執(zhí)行批量指令,并通過Receive
方法一一獲取返回結(jié)果。
package main import ( "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gconv" ) func main() { conn := g.Redis().Conn() defer conn.Close() conn.Send("SET", "foo", "bar") conn.Send("GET", "foo") conn.Flush() // reply from SET conn.Receive() // reply from GET v, _ := conn.Receive() fmt.Println(gconv.String(v)) //打印結(jié)果:bar }
讓我想到了之前寫的一篇爆文:Redis 如何批量設(shè)置過期時(shí)間?PIPLINE的使用
我們可以通過Redis
的SUBSCRIBE/PUBLISH
命令實(shí)現(xiàn)訂閱/發(fā)布模式。
package main import ( "fmt" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/util/gconv" ) func main() { conn := g.Redis().Conn() defer conn.Close() _, err := conn.Do("SUBSCRIBE", "channel") if err != nil { panic(err) } for { reply, err := conn.Receive() if err != nil { panic(err) } fmt.Println(gconv.Strings(reply)) } }
執(zhí)行后,程序?qū)⒆枞却@取數(shù)據(jù)。
另外打開一個(gè)終端通過redis-cli
命令進(jìn)入Redis Server,發(fā)布一條消息:
$ redis-cli 127.0.0.1:6379> publish channel test (integer) 1 127.0.0.1:6379>
隨后程序終端立即打印出從Redis Server獲取的數(shù)據(jù):
[message channel test]
當(dāng)給定的參數(shù)為map
, slice
, struct
時(shí),gredis
內(nèi)部支持自動(dòng)對(duì)其使用json
序列化,并且讀取數(shù)據(jù)時(shí)可使用gvar.Var
的轉(zhuǎn)換功能實(shí)現(xiàn)反序列化。
map
存取package test import ( "fmt" "github.com/gogf/gf/container/gvar" "github.com/gogf/gf/frame/g" ) func Run1() { var ( err error result *gvar.Var key = "test_user" data = g.Map{ "id": 7, "name": "王中陽", } ) _, err = g.Redis().Do("SET", key, data) if err != nil { panic(err) } result, err = g.Redis().DoVar("GET", key) if err != nil { panic(err) } fmt.Println("result:", result) //result: {"id":7,"name":"王中陽"} fmt.Println("result.Map():", result.Map()) //result.Map(): map[id:7 name:王中陽] }
struct
存取package test import ( "fmt" "github.com/gogf/gf/container/gvar" "github.com/gogf/gf/frame/g" ) func Run1() { type User struct { Id int Name string } var ( err error result *gvar.Var key = "test_user" user = &User{ Id: 007, Name: "王中陽", } ) _, err = g.Redis().Do("SET", key, user) if err != nil { panic(err) } result, err = g.Redis().DoVar("GET", key) if err != nil { panic(err) } var user2 *User if err = result.Struct(&user2); err != nil { panic(err) } fmt.Println("user2:", user2) //user2: &{7 王中陽} fmt.Printf("id:%v, name:%v \n", user2.Id, user2.Name) //id:7, name:王中陽 }
關(guān)于“GoFrame gredis怎么緩存DoVar Conn連接對(duì)象實(shí)現(xiàn)自動(dòng)序列化”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“GoFrame gredis怎么緩存DoVar Conn連接對(duì)象實(shí)現(xiàn)自動(dòng)序列化”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。