網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Go-操作redis
安裝
golang操作redis的客戶(hù)端包有多個(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)。客戶(hù)端可以使用send()方法一次性向服務(wù)器發(fā)送一個(gè)或多個(gè)命令,命令發(fā)送完畢時(shí),使用flush()方法將緩沖區(qū)的命令輸入一次性發(fā)送到服務(wù)器,客戶(hù)端再使用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:開(kāi)啟事務(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()
寫(xiě)入
//寫(xiě)入 //_, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") _, err = conn.Do("reids寫(xiě)入方法", "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() //寫(xiě)入 _, 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) } }
原文鏈接:https://www.cnblogs.com/guyouyin123/p/14098324.html
相關(guān)推薦
- 2022-01-30 tortoisegit pull時(shí)報(bào)錯(cuò)
- 2022-05-10 Element-ui 中 Table 表格的設(shè)置表頭/去除下標(biāo)線(xiàn)/設(shè)置行間距等屬性的使用及 slot
- 2023-11-21 Ubuntu/Linux解壓文件、壓縮文件(.tar .tgz .tar.gz .tar.Z .ta
- 2022-08-22 Android中關(guān)于Binder常見(jiàn)面試問(wèn)題小結(jié)_Android
- 2022-05-15 jquery事件綁定方法介紹_jquery
- 2023-04-03 Input系統(tǒng)分發(fā)策略及其應(yīng)用示例詳解_Android
- 2022-05-27 Python腳本傳參數(shù)argparse模塊的使用_python
- 2022-05-15 C++單例類(lèi)宏定義,方便快速實(shí)現(xiàn)單例類(lèi)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支