golang redis中Pipeline通道的使用詳解
goredis庫連接客戶端
package client import ( "github.com/go-redis/redis" "github.com/sirupsen/logrus" ) var MainRDS *redis.Client func init() { ConnectRedis() } func ConnectRedis() { MainRDS = redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379", Password: "******"}) err := MainRDS.Ping().Err() if err != nil { logrus.Infof("[ConnectRedis]connect redis error:%s", err.Error()) panic("init client error") } }
一、pipeline出現的背景
redis客戶端執行一條命令分4個過程:
發送命令 -> 命令排隊 -> 命令執行 -> 返回結果
這個過程稱為Round trip time(簡稱RTT, 往返時間),mget、mset有效節約瞭RTT,但大部分命令不支持批量操作,需要消耗N次RTT ,這個時候需要pipeline來解決這個問題。
Pipeline 主要是一種網絡優化,它本質上意味著客戶端緩沖一堆命令並一次性將它們發送到服務器,減少瞭每條命令分別傳輸的IO開銷, 同時減少瞭系統調用的次數,因此提升瞭整體的吞吐能力,節省瞭每個命令的網絡往返時間(RTT)。
二、pipeline的用法
Pipeline 基本示例如下:
pipe := Redis.Pipeline() pipe.Del(context.Background(), "test1") pipe.Del(context.Background(), "test2") ret, err := pipe.Exec(context.Background()) fmt.Println(ret, err)
上面的代碼相當於將以下兩個命令一次發給redis server端執行與不使用Pipeline相比能減少一次RTT。
del test1
del test2
pipeline命令的使用
PS:如果redis采用瞭集群部署,不可以直接使用pipeline命令進行操作,因為訪問的key可能並不在同一個節點上
// PipelineGetHashField 使用pipeline命令獲取多個hash key的單個字段 // keyList,需要獲取的hash key列表 // field 需要獲取的字段值 func PipelineGetHashField(keyList []string,filed string) []string { pipeClient :=client.MainRDS.Pipeline() for _, key := range keyList { pipeClient.HGet(key, filed) } res, err := pipeClient.Exec() if err != nil { if err != redis.Nil { logrus.WithField("key_list", keyList).Errorf("[PipelineGetHashField] get from redis error:%s", err.Error()) } /********** !!!!!!!!!!*************/ // 註意這裡如果某一次獲取時出錯(常見的redis.Nil),返回的err即不為空 // 如果需要處理redis.Nil為默認值,此處不能直接return } valList := make([]string, 0, len(keyList)) for index, cmdRes := range res { var val string // 此處斷言類型為在for循環內執行的命令返回的類型,上面HGet返回的即為*redis.StringCmd類型 // 處理方式和直接調用同樣處理即可 cmd, ok := cmdRes.(*redis.StringCmd) if ok { val,err = cmd.Result() if err != nil { logrus.WithField("key",keyList[index]).Errorf("[PipelineGetHashField] get key error:%s",err.Error()) } } valList = append(valList, val) } return valList }
到此這篇關於golang redis中Pipeline通道的使用詳解的文章就介紹到這瞭,更多相關golang redis中Pipeline通道內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Golang實現可重入鎖的示例代碼
- 一文搞懂Go語言操作Redis的方法
- Go語言操作redis數據庫的方法
- redis cluster支持pipeline的實現思路
- golang在GRPC中設置client的超時時間