<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
golang操作redis的使用者端包有多個比如redigo、go-redis,github上Star最多的莫屬redigo。
github地址:https://github.com/garyburd/redigo 目前已經遷移到: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共同作業的主要介面,可以使用Dial,DialWithTimeout或者NewConn函數來建立連線,當任務完成時,應用程式必須呼叫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() }
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) } }
_, err = conn.Do("expire", "name", 10) //10秒過期 if err != nil { fmt.Println("set expire error: ", err) return }
_, 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)) } //結果: //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
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
管道操作可以理解為並行操作,並通過Send(),Flush(),Receive()三個方法實現。使用者端可以使用send()方法一次性向伺服器傳送一個或多個命令,命令傳送完畢時,使用flush()方法將緩衝區的命令輸入一次性傳送到伺服器,使用者端再使用Receive()方法依次按照先進先出的順序讀取所有命令操作結果。
Send(commandName string, args ...interface{}) error Flush() error Receive() (reply interface{}, err error)
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:%vn",res2) res3, err := conn.Receive() fmt.Printf("Receive res3:%sn",res3) } //Receive res1:0 //Receive res2:0 //Receive res3:22
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: %sn", v.Channel, v.Data) case redis.Subscription: fmt.Printf("%s: %s %dn", v.Channel, v.Kind, v.Count) case error: fmt.Println(v) return } } } func Push(message string) { //釋出者 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
MULTI, EXEC,DISCARD和WATCH是構成Redis事務的基礎,當然我們使用go語言對redis進行事務操作的時候本質也是使用這些命令。
MULTI:開啟事務
EXEC:執行事務
DISCARD:取消事務
WATCH:監視事務中的鍵變化,一旦有改變則取消事務。
範例:
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]
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名字", "內容1","內容2","內容3") if err != nil { fmt.Println("redis set error:", err) }
//讀取 redis.Strings:返回多個 redis.String:返回一個 redis.int:返回統計的數位 //獲取集合所有成員 //name, err := redis.Strings(conn.Do("smembers", "beautiful_user")) // 返回集合成員數 //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的範例解析的詳細內容,更多關於Go操作redis與redigo的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45