最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang redis中Pipeline通道的使用詳解

 更新時(shí)間:2022年06月02日 11:29:59   作者:sweey_lff  
本文主要介紹了golang redis中Pipeline通道的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

goredis庫(kù)連接客戶端

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出現(xiàn)的背景

redis客戶端執(zhí)行一條命令分4個(gè)過程:

發(fā)送命令 -> 命令排隊(duì) -> 命令執(zhí)行 -> 返回結(jié)果

這個(gè)過程稱為Round trip time(簡(jiǎn)稱RTT, 往返時(shí)間),mget、mset有效節(jié)約了RTT,但大部分命令不支持批量操作,需要消耗N次RTT ,這個(gè)時(shí)候需要pipeline來(lái)解決這個(gè)問題。

Pipeline 主要是一種網(wǎng)絡(luò)優(yōu)化,它本質(zhì)上意味著客戶端緩沖一堆命令并一次性將它們發(fā)送到服務(wù)器,減少了每條命令分別傳輸?shù)腎O開銷, 同時(shí)減少了系統(tǒng)調(diào)用的次數(shù),因此提升了整體的吞吐能力,節(jié)省了每個(gè)命令的網(wǎng)絡(luò)往返時(shí)間(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)

上面的代碼相當(dāng)于將以下兩個(gè)命令一次發(fā)給redis server端執(zhí)行與不使用Pipeline相比能減少一次RTT。

del test1
del test2

pipeline命令的使用

PS:如果redis采用了集群部署,不可以直接使用pipeline命令進(jìn)行操作,因?yàn)樵L問的key可能并不在同一個(gè)節(jié)點(diǎn)上

// PipelineGetHashField 使用pipeline命令獲取多個(gè)hash key的單個(gè)字段
// 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())
        }
        /********** !?。。。。。。。?!*************/
        // 注意這里如果某一次獲取時(shí)出錯(cuò)(常見的redis.Nil),返回的err即不為空
        // 如果需要處理redis.Nil為默認(rèn)值,此處不能直接return
    }
    valList := make([]string, 0, len(keyList))
    for index, cmdRes := range res {
        var val string
        // 此處斷言類型為在for循環(huán)內(nèi)執(zhí)行的命令返回的類型,上面HGet返回的即為*redis.StringCmd類型
        // 處理方式和直接調(diào)用同樣處理即可
        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
}

到此這篇關(guān)于golang redis中Pipeline通道的使用詳解的文章就介紹到這了,更多相關(guān)golang redis中Pipeline通道內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于go微服務(wù)效率工具goctl深度解析

    基于go微服務(wù)效率工具goctl深度解析

    這篇文章主要為大家介紹了基于go微服務(wù)效率工具goctl深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言中g(shù)orm時(shí)間格式化

    go語(yǔ)言中g(shù)orm時(shí)間格式化

    本文主要介紹了go語(yǔ)言中g(shù)orm時(shí)間格式化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    詳解go語(yǔ)言中type關(guān)鍵詞的幾種使用

    這篇文章主要介紹了詳解go語(yǔ)言中type的幾種使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀

    這篇文章主要為大家介紹了Go channel發(fā)送方和接收方如何相互阻塞等待源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang交叉編譯之跨平臺(tái)編譯使用詳解

    Golang交叉編譯之跨平臺(tái)編譯使用詳解

    這篇文章主要為大家介紹了Golang交叉編譯之跨平臺(tái)編譯使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Golang中map縮容的實(shí)現(xiàn)

    Golang中map縮容的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言中map的擴(kuò)縮容機(jī)制,包括grow和hashGrow方法的處理,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • Go處理包含多種引號(hào)的字符串的幾種方法

    Go處理包含多種引號(hào)的字符串的幾種方法

    在Go中,有幾種方式可以處理包含多種引號(hào)的字符串,以確保代碼的可讀性和正確性,本文將給大家詳細(xì)介紹了這幾種處理方式,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • 詳解minio分布式文件存儲(chǔ)

    詳解minio分布式文件存儲(chǔ)

    MinIO 是一款基于 Go 語(yǔ)言的高性能、可擴(kuò)展、云原生支持、操作簡(jiǎn)單、開源的分布式對(duì)象存儲(chǔ)產(chǎn)品,這篇文章主要介紹了minio分布式文件存儲(chǔ),需要的朋友可以參考下
    2023-10-10
  • Go unsafe 包的使用詳解

    Go unsafe 包的使用詳解

    這篇文章主要介紹了Go unsafe 包的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺談golang并發(fā)操作變量安全的問題

    淺談golang并發(fā)操作變量安全的問題

    這篇文章主要介紹了淺談golang并發(fā)操作變量安全的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-12-12

最新評(píng)論

施秉县| 尉犁县| 北川| 南丰县| 诸暨市| 镇安县| 建瓯市| 巍山| 永顺县| 杂多县| 南投市| 徐汇区| 三门峡市| 丹巴县| 虎林市| 武邑县| 永修县| 喜德县| 墨竹工卡县| 承德县| 漠河县| 贵南县| 新兴县| 从江县| 城口县| 桐庐县| 巨野县| 友谊县| 昌平区| 永顺县| 新宾| 双桥区| 衡阳县| 东台市| 雷波县| 南宫市| 云浮市| 松溪县| 九龙坡区| 舟山市| 龙山县|