您好,登錄后才能下訂單哦!
這篇文章主要介紹了GoFrame gredis怎么緩存DoVar Conn連接對象實現自動序列化的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇GoFrame gredis怎么緩存DoVar Conn連接對象實現自動序列化文章都會有所收獲,下面我們一起來看看吧。
Redis客戶端由gredis
模塊實現,底層采用了鏈接池設計。
gredis
使用了連接池來進行Redis
連接管理,通過Config
配置對象或者Set*
方法可以對連接池的屬性進行管理,通過Stats
方法可以獲取連接池的統計信息。
我們最常用的是Do/DoVar
方法,執行同步指令,通過向Redis Server
發送對應的Redis API
命令,來使用Redis Server
的服務。Do/Var
方法最大的特點是內部自行從連接池中獲取連接對象,使用完畢后自動丟回連接池中,開發者無需手動調用Close
方法,方便使用。
Do/DoVar
方法我們最常用的是Do/DoVar
方法,執行同步指令,通過向Redis Server
發送對應的Redis API
命令,來使用Redis Server
的服務。
Do/Var
方法最大的特點是內部自行從連接池中獲取連接對象,使用完畢后自動丟回連接池中,開發者無需手動調用Close
方法,方便使用。
Do
和DoVar
的區別在于返回的結果類型不一樣,DoVar
返回的是gvar.Var
類型,該類型對象可以執行非常方便的類型轉換。
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 命令用于為哈希表中的字段賦值 。
如果哈希表不存在,一個新的哈希表被創建并進行 HSET 操作。
如果字段已經存在于哈希表中,舊值將被覆蓋。
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()) //打印結果: map[id:10000 name:王中陽] }
HMSET/HMGET
操作強烈推薦,非常好用:我們可以通過map
參數執行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()) //打印結果 [王中陽] }
我們也可以通過struct
參數執行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()) //打印結果: [王中陽] }
Conn
連接對象使用Do/DoVar
方法已經能夠滿足絕大部分的場景需要,如果需要更復雜的Redis操作,我們可以使用Conn
方法從連接池中獲取一個連接對象,隨后使用該連接對象進行操作。
需要注意的是,該連接對象不再使用時,應當顯式調用Close
方法進行關閉(丟回連接池)。
由于該Conn
是個連接對象,注意該對象存在連接超時的限制,超時和服務端配置有關。
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)) //打印結果:v }
Send
批量指令Send
可以執行批量指令,并通過Receive
方法一一獲取返回結果。
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)) //打印結果:bar }
讓我想到了之前寫的一篇爆文:Redis 如何批量設置過期時間?PIPLINE的使用
我們可以通過Redis
的SUBSCRIBE/PUBLISH
命令實現訂閱/發布模式。
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)) } }
執行后,程序將阻塞等待獲取數據。
另外打開一個終端通過redis-cli
命令進入Redis Server,發布一條消息:
$ redis-cli 127.0.0.1:6379> publish channel test (integer) 1 127.0.0.1:6379>
隨后程序終端立即打印出從Redis Server獲取的數據:
[message channel test]
當給定的參數為map
, slice
, struct
時,gredis
內部支持自動對其使用json
序列化,并且讀取數據時可使用gvar.Var
的轉換功能實現反序列化。
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:王中陽 }
關于“GoFrame gredis怎么緩存DoVar Conn連接對象實現自動序列化”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“GoFrame gredis怎么緩存DoVar Conn連接對象實現自動序列化”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。