最新国产好看的视频,伊人天堂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à)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

這個(gè)過程稱為Round trip time(簡稱RTT, 往返時(shí)間),mget、mset有效節(jié)約了RTT,但大部分命令不支持批量操作,需要消耗N次RTT ,這個(gè)時(shí)候需要pipeline來解決這個(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語言中g(shù)orm時(shí)間格式化

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

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

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

    這篇文章主要介紹了詳解go語言中type的幾種使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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語言中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 語言的高性能、可擴(kuò)展、云原生支持、操作簡單、開源的分布式對(duì)象存儲(chǔ)產(chǎn)品,這篇文章主要介紹了minio分布式文件存儲(chǔ),需要的朋友可以參考下
    2023-10-10
  • Go unsafe 包的使用詳解

    Go unsafe 包的使用詳解

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

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

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

最新評(píng)論

安义县| 建阳市| 内江市| 铜陵市| 五莲县| 成安县| 福泉市| 盐城市| 商洛市| 义马市| 英德市| 渭源县| 清苑县| 恩施市| 仪陇县| 剑川县| 山阳县| 玛曲县| 阿拉善左旗| 清水河县| 正镶白旗| 密山市| 涟源市| 兴安县| 林甸县| 齐齐哈尔市| 涟水县| 靖宇县| 汝州市| 布尔津县| 固安县| 五峰| 蓬安县| 宝应县| 当阳市| 潼关县| 阿城市| 万盛区| 嘉义市| 瓦房店市| 建阳市|