Go操作redis與redigo的示例解析
Go-操作redis
安裝
golang操作redis的客戶端包有多個(gè)比如redigo、go-redis,github上Star最多的莫屬redigo。
github地址:https://github.com/garyburd/redigo 目前已經(jīng)遷移到:https://github.com/gomodule/redigo
文檔:https://godoc.org/github.com/garyburd/redigo/redis
go get github.com/garyburd/redigo/redis import "github.com/garyburd/redigo/redis"
連接
Conn接口是與Redis協(xié)作的主要接口,可以使用Dial,DialWithTimeout或者NewConn函數(shù)來(lái)創(chuàng)建連接,當(dāng)任務(wù)完成時(shí),應(yīng)用程序必須調(diào)用Close函數(shù)來(lái)完成操作。
package main import ( "github.com/garyburd/redigo/redis" "fmt" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() }
使用
package main import ( "github.com/garyburd/redigo/redis" "fmt" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("SET", "name", "wd") if err != nil { fmt.Println("redis set error:", err) } name, err := redis.String(conn.Do("GET", "name")) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", name) } }
設(shè)置key過(guò)期時(shí)間
_, err = conn.Do("expire", "name", 10) //10秒過(guò)期 if err != nil { fmt.Println("set expire error: ", err) return }
批量獲取mget、批量設(shè)置mset
_, err = conn.Do("MSET", "name", "wd","age",22) if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.Strings(conn.Do("MGET", "name","age")) if err != nil { fmt.Println("redis get error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("MGET name: %s \n", res) fmt.Println(len(res)) } //結(jié)果: //res type : []string //MGET name: [wd 22] //2
列表操作
package main import ( "github.com/garyburd/redigo/redis" "fmt" "reflect" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.String(conn.Do("LPOP", "list1")) if err != nil { fmt.Println("redis POP error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("res : %s \n", res) } } //res type : string //res : ele3
hash操作
package main import ( "github.com/garyburd/redigo/redis" "fmt" "reflect" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("HSET", "student","name", "wd","age",22) if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.Int64(conn.Do("HGET", "student","age")) if err != nil { fmt.Println("redis HGET error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("res : %d \n", res) } } //res type : int64 //res : 22
Pipelining(管道)
管道操作可以理解為并發(fā)操作,并通過(guò)Send(),F(xiàn)lush(),Receive()三個(gè)方法實(shí)現(xiàn)??蛻舳丝梢允褂胹end()方法一次性向服務(wù)器發(fā)送一個(gè)或多個(gè)命令,命令發(fā)送完畢時(shí),使用flush()方法將緩沖區(qū)的命令輸入一次性發(fā)送到服務(wù)器,客戶端再使用Receive()方法依次按照先進(jìn)先出的順序讀取所有命令操作結(jié)果。
Send(commandName string, args ...interface{}) error Flush() error Receive() (reply interface{}, err error)
- Send:發(fā)送命令至緩沖區(qū)
- Flush:清空緩沖區(qū),將命令一次性發(fā)送至服務(wù)器
- Recevie:依次讀取服務(wù)器響應(yīng)結(jié)果,當(dāng)讀取的命令未響應(yīng)時(shí),該操作會(huì)阻塞。
package main import ( "github.com/garyburd/redigo/redis" "fmt" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() conn.Send("HSET", "student","name", "wd","age","22") conn.Send("HSET", "student","Score","100") conn.Send("HGET", "student","age") conn.Flush() res1, err := conn.Receive() fmt.Printf("Receive res1:%v \n", res1) res2, err := conn.Receive() fmt.Printf("Receive res2:%v\n",res2) res3, err := conn.Receive() fmt.Printf("Receive res3:%s\n",res3) } //Receive res1:0 //Receive res2:0 //Receive res3:22
redis發(fā)布會(huì)訂閱模式
package main import ( "github.com/garyburd/redigo/redis" "fmt" "time" ) func Subs() { //訂閱者 conn, err := redis.Dial("tcp", "10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :", err) return } defer conn.Close() psc := redis.PubSubConn{conn} psc.Subscribe("channel1") //訂閱channel1頻道 for { switch v := psc.Receive().(type) { case redis.Message: fmt.Printf("%s: message: %s\n", v.Channel, v.Data) case redis.Subscription: fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count) case error: fmt.Println(v) return } } } func Push(message string) { //發(fā)布者 conn, _ := redis.Dial("tcp", "10.1.210.69:6379") _,err1 := conn.Do("PUBLISH", "channel1", message) if err1 != nil { fmt.Println("pub err: ", err1) return } } func main() { go Subs() go Push("this is wd") time.Sleep(time.Second*3) } //channel1: subscribe 1 //channel1: message: this is wd
事務(wù)操作
MULTI, EXEC,DISCARD和WATCH是構(gòu)成Redis事務(wù)的基礎(chǔ),當(dāng)然我們使用go語(yǔ)言對(duì)redis進(jìn)行事務(wù)操作的時(shí)候本質(zhì)也是使用這些命令。
MULTI:開啟事務(wù)
EXEC:執(zhí)行事務(wù)
DISCARD:取消事務(wù)
WATCH:監(jiān)視事務(wù)中的鍵變化,一旦有改變則取消事務(wù)。
示例:
package main import ( "github.com/garyburd/redigo/redis" "fmt" ) func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() conn.Send("MULTI") conn.Send("INCR", "foo") conn.Send("INCR", "bar") r, err := conn.Do("EXEC") fmt.Println(r) } //[1, 1]
萬(wàn)能操作
連接redis
conn,err := redis.Dial( "tcp", "10.0.3.100:6379", redis.DialPassword("EfcHGSzKqg6cfzWq"), redis.DialDatabase(8)) if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close()
寫入
//寫入 //_, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") _, err = conn.Do("reids寫入方法", "key名字", "內(nèi)容1","內(nèi)容2","內(nèi)容3") if err != nil { fmt.Println("redis set error:", err) }
讀取
//讀取 redis.Strings:返回多個(gè) redis.String:返回一個(gè) redis.int:返回統(tǒng)計(jì)的數(shù)字 //獲取集合所有成員 //name, err := redis.Strings(conn.Do("smembers", "beautiful_user")) // 返回集合成員數(shù) //name, err := redis.Int(conn.Do("scard", "beautiful_user")) name, err := redis.方法名(conn.Do("redis讀取方法", "key名字")) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", name) }
全部代碼
package main import ( "fmt" "github.com/garyburd/redigo/redis" ) func main() { conn,err := redis.Dial("tcp","10.0.3.100:6379",redis.DialPassword("EfcHGSzKqg6cfzWq"),redis.DialDatabase(8)) if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() //寫入 _, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") if err != nil { fmt.Println("redis set error:", err) } //讀取 name, err := redis.Strings(conn.Do("smembers", "beautiful_user")) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", name) } }
以上就是Go操作redis與redigo的示例解析的詳細(xì)內(nèi)容,更多關(guān)于Go操作redis與redigo的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
聊聊golang中多個(gè)defer的執(zhí)行順序
這篇文章主要介紹了golang中多個(gè)defer的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05詳解Go語(yǔ)言運(yùn)用廣度優(yōu)先搜索走迷宮
廣度優(yōu)先搜索是從圖中的某一頂點(diǎn)出發(fā),遍歷每一個(gè)頂點(diǎn)時(shí),依次遍歷其所有的鄰接點(diǎn),再?gòu)倪@些鄰接點(diǎn)出發(fā),依次訪問(wèn)它們的鄰接點(diǎn),直到圖中所有被訪問(wèn)過(guò)的頂點(diǎn)的鄰接點(diǎn)都被訪問(wèn)到。然后查看圖中是否存在尚未被訪問(wèn)的頂點(diǎn),若有,則以該頂點(diǎn)為起始點(diǎn),重復(fù)上述遍歷的過(guò)程2021-06-06