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

重學(xué)Go語(yǔ)言之如何使用Redis

 更新時(shí)間:2023年08月01日 11:00:10   作者:程序員讀書(shū)  
Redis是我們開(kāi)發(fā)應(yīng)用程序中很常用的NoSQL數(shù)據(jù)庫(kù),那么在Go語(yǔ)言中要如何連接和操作Redis呢,在這篇文章中,我們就來(lái)一起來(lái)探究一下吧

Redis是我們開(kāi)發(fā)應(yīng)用程序中很常用的NoSQL數(shù)據(jù)庫(kù),作為一款內(nèi)存數(shù)據(jù)庫(kù),Redis也支持?jǐn)?shù)據(jù)持久化(RDBAOF兩種機(jī)制),所以Redis既可以作為數(shù)據(jù)庫(kù)來(lái)使用,也可以作為關(guān)系型數(shù)據(jù)庫(kù)與應(yīng)用程序之間的緩存來(lái)使用。

那么在Go語(yǔ)言中要如何連接和操作Redis呢?在這篇文章中,我們一起來(lái)探究一下!

開(kāi)始

在開(kāi)始操作Redis之前,我們先來(lái)初始化我們的示例項(xiàng)目,接著再安裝連接Redis所需要的第三方庫(kù)。

初始化項(xiàng)目

由于我們接下來(lái)要用到的第三方庫(kù)需要Go Moudles的支持,因此我們先使用go mod init命令初始化我們的示例項(xiàng)目:

go?mod?init?GoTest

Go Redis

由于Go語(yǔ)言的標(biāo)準(zhǔn)庫(kù)并沒(méi)有提供對(duì)Redis的支持,因此就需要使用到Go社區(qū)的第三方庫(kù)。

在這里推薦用Go Reids,該庫(kù)最新版本的Github地址為:

github.com/redis/go-redis

為什么推薦使用Go Redis

推薦使用Go Redis的原因有以下幾點(diǎn):

  • Go RedisRedis官方推薦的第三方庫(kù)。
  • 社區(qū)中使用的人也比較多,而且文檔很齊全。
  • 支持不同種類(lèi)的Redis客戶端,比如哨兵客戶端,集群客戶端等。
  • 支持所有的Redis版本。

Go Redis安裝

通過(guò)cd命令進(jìn)入項(xiàng)目,執(zhí)行go get命令就可以下載安裝 github.com/redis/go-redis/v9

cd?GoTest
#最新版本為v9
go?get?github.com/redis/go-redis/v9

連接Redis

如同所有的Client/Server應(yīng)用程序一樣,要想操作Redis,就必須先與Redis建立網(wǎng)絡(luò)連接。

簡(jiǎn)單連接

如果是連接部署在內(nèi)部網(wǎng)絡(luò)沒(méi)有密碼的Redis服務(wù)器,只需要IP端口號(hào)(port)就可以連接了:

import?"github.com/redis/go-redis/v9"
opt?:=?&redis.Options{
?Addr:???"localhost:6379",
}
rdb?:=?redis.NewClient(opt)

上面代碼中,可以概述為以下兩個(gè)步驟:

  • 實(shí)例化一個(gè)redis.Options表示連接配置對(duì)象,該對(duì)象當(dāng)前設(shè)置了Addr字段,該 字段表示Redis服務(wù)器的地址。
  • redis.Options對(duì)象傳給redis.NewClient()函數(shù),redis.NewClient()函數(shù)會(huì)返回一個(gè)操作Redis的句柄rdb

redis.ParseURL

除了自定義redis.Options,另一種方式是調(diào)用redis.ParseURL()函數(shù)以下格式的URL,該函數(shù)會(huì)返回一個(gè)redis.Options對(duì)象:

redis://<user>:<pass>@localhost:6379/<port>

因此我們可以將上面連接Redis的例子改寫(xiě)為:

import?"github.com/redis/go-redis/v9"
opt,?err?:=?redis.ParseURL("redis://localhost:6379")
if?err?!=?nil?{
?panic(err)
}
rdb?:=?redis.NewClient(opt)

redis.Options

前面我們連接Redis的例子中只用到了redis.OptionsAddr字段:

opt?:=?&redis.Options{
?Addr:???"localhost:6379",
}

除此之外,我們也可以通過(guò)redis.Options的字段配置連接的參數(shù):

opt?:=?&redis.Options{
??//地址與端口
?Addr:???"localhost:6379",
?//數(shù)據(jù)庫(kù),0~16
??DB:0,
??//用戶名,在Redis6.0以上使用
?Username:"test",
?//密碼
?Password:"123456",
?//命令最大重試次數(shù)
??MaxRetries:3,
??//連接超時(shí)
?DialTimeout:3,
??//連接池
?PoolSize:30,
?//最小空閑連接數(shù)
??MinIdleConns:10,
??//最大空閑連接數(shù)
?MaxIdleConns:30,
}

上面列舉的是redis.Options比較常用的字段,實(shí)際上還有很多其他的字段參數(shù),這里就不一一列舉了。

Redis操作

雖然已經(jīng)通過(guò)redis.NewClient()函數(shù)獲取操作Redis的句柄了,但要操作Redis了,還需要?jiǎng)?chuàng)建一個(gè)Context對(duì)象,這是因?yàn)樗械?code>Go Redis操作Redis的方法的第一個(gè)參數(shù)都是Context

創(chuàng)建Context

Context表示上下文,可以用于超時(shí)控制、數(shù)據(jù)傳遞以及性能監(jiān)控等。

通過(guò)context包的Backgroud()函數(shù)可以創(chuàng)建一個(gè)根Context:

ctx?:=?context.Background()

執(zhí)行已支持的命令

Go Redis為所有的Redis命令都提供了對(duì)應(yīng)的方法,比如SET命令對(duì)應(yīng)的方法為Set,HGET對(duì)應(yīng)的方法為HGet。

因此如果想執(zhí)行對(duì)應(yīng)的Redis命令,直接調(diào)用對(duì)應(yīng)的方法即可,比如:

redis>?set?test?test_value?0
redis>?hset?user:1?id?1?name?小張?gender?男

使用Go Redis執(zhí)行上面命令的代碼為:

rdb.Set(ctx,?"test",?"test_value",?0)
rdb.HSet(ctx,?"user:1",?"id",1,"name",?"小張",?"gender",?"男")

Redis命令執(zhí)行后,一般都有返回值,但是不同的命令的返回值是不一樣的,最簡(jiǎn)單的返回如SET命令返回一個(gè)字符串,HSET命令會(huì)返回一個(gè)整數(shù),而HGETALL會(huì)返回一個(gè)類(lèi)似結(jié)構(gòu)體的數(shù)據(jù):

package?main
import?(
?"context"
?"fmt"
?"github.com/redis/go-redis/v9"
)
func?main()?{
?rdb?:=?redis.NewClient(&redis.Options{
??Addr:?"localhost:6379",
?})
?ctx?:=?context.Background()
?setCmd?:=?rdb.Set(ctx,?"test",?"test_value",?0)
?hSetCmd?:=?rdb.HSet(ctx,?"user:1",?"id",?1,?"name",?"小張",?"gender",?"男")
?hAllGetCmd?:=?rdb.HGetAll(ctx,?"user:1")
}

在上面的代碼中,我們可以看到在執(zhí)行不同命令時(shí),會(huì)返回不同cmd對(duì)象,比如Set()方法返回一個(gè)StatusCmd對(duì)象,HSet()方法返回IntCmd對(duì)象,而HGetAll()方法返回MapStringStringCmd對(duì)象。

有了cmd對(duì)象后,就可以獲取命令執(zhí)行結(jié)果及錯(cuò)誤信息,有兩種方法,一種是直接調(diào)用Result()方法返回結(jié)果與錯(cuò)誤信息:

fmt.Println(setCmd.Result())
fmt.Println(hSetCmd.Result())
fmt.Println(hAllGetCmd.Result())

另一種方法是分開(kāi)獲得取結(jié)果和錯(cuò)誤信息:

fmt.Println(setCmd.Val(),setCmd.Err())
fmt.Println(hSetCmd.Val(),hSetCmd.Err())
fmt.Println(hAllGetCmd.Val(),hAllGetCmd.Err())

上面兩種輸出方式輸出的的結(jié)果都是:

OK <nil>
3 <nil>
map[gender:男 id:1 name:小張] <nil>

如果我們獲得取一個(gè)不存在的key,此時(shí)命令會(huì)返回一個(gè)特殊的錯(cuò)誤redis.Nil,這是一個(gè)特殊的錯(cuò)誤,用于表示是否獲得取了空值:

val,?err?:=?rdb.Get(ctx,?"key").Result()
switch?{
case?err?==?redis.Nil:
?fmt.Println("key不存在")
case?err?!=?nil:
?fmt.Println("錯(cuò)誤",?err)
case?val?==?"":
?fmt.Println("值是空字符串")
}

執(zhí)行尚未支持的命令

當(dāng)然,有時(shí)候Redis新的版本可能會(huì)添加一些新的命令,而Go Redis還未提供支持,這時(shí)候可以調(diào)用Do方法來(lái)執(zhí)行對(duì)應(yīng)的命令,實(shí)際上Do()方法可以用于執(zhí)行任何命令:

val,?err?:=?rdb.Do(ctx,?"hgetall",?"user:1").Result()
if?err?!=?nil?{
?if?err?==?redis.Nil?{
??fmt.Println("key?does?not?exists")
??return
?}
?panic(err)
}
fmt.Println(val.(MapStringStringCmd))

從上面的例子可以看出Do()執(zhí)行不同的命令后返回值也是不同的。

結(jié)果集映射

有時(shí)候我們查詢Redis后會(huì)返回多個(gè)key-value的結(jié)果集,比如mget、hgethgetall這樣的命令,Go redis提供了Scan()方法可以將查詢回來(lái)的結(jié)果集掃描進(jìn)對(duì)應(yīng)的結(jié)構(gòu)體當(dāng)中:

package?main
import?(
?"context"
?"fmt"
?"github.com/redis/go-redis/v9"
)
type?User?struct?{
?ID?????int????`redis:"id"`
?Name???string?`redis:"name"`
?Gender?string?`redis:"gender"`
}
func?main()?{
?rdb?:=?redis.NewClient(&redis.Options{
??Addr:?"localhost:6379",
?})
?ctx?:=?context.Background()
?var?u?User
?err?:=?rdb.HGetAll(ctx,?"user:1").Scan(&u)
?if?err?!=?nil?{
??panic(err)
?}
?fmt.Println(u)
}

管道

管道(pipeline)允許在一次請(qǐng)求中發(fā)送多條Redis命令,并返回多個(gè)結(jié)果,這樣可以節(jié)省一個(gè)一個(gè)執(zhí)行命令需要付出的往返回時(shí)間:

package?main
import?(
?"context"
?"fmt"
?"github.com/redis/go-redis/v9"
)
func?main()?{
?opt?:=?&redis.Options{
??Addr:?"localhost:6379",
?}
?rdb?:=?redis.NewClient(opt)
?ctx?:=?context.Background()
?cmds,?err?:=?rdb.Pipelined(ctx,?func(pipe?redis.Pipeliner)?error?{
??pipe.Set(ctx,?"test",?"test_value",?0)
??pipe.HSet(ctx,?"user:1",?"id",?1,?"name",?"小張",?"gender",?"男")
??pipe.HGetAll(ctx,?"user:1")
??return?nil
?})
?if?err?!=?nil?{
??panic(err)
?}
?for?_,?cmd?:=?range?cmds?{
??switch?c?:=?cmd.(type)?{
??case?*redis.IntCmd:
???fmt.Println(c.Val())
??case?*redis.StatusCmd:
???fmt.Println(c.Val())
??case?*redis.MapStringStringCmd:
???fmt.Println(c.Val())
??}
?}
}

發(fā)布與訂閱

Go Redis支持發(fā)布與訂閱(Pub/Sub)。

發(fā)布消息

發(fā)布消息的方法為Publish:

package?main
import?(
?"context"
?"fmt"
?"github.com/redis/go-redis/v9"
)
func?main()?{
?rdb?:=?redis.NewClient(&redis.Options{
??Addr:?"localhost:6379",
?})
?ctx?:=?context.Background()
??//向渠道發(fā)送消息
?err?:=?rdb.Publish(ctx,?"mychannel",?"this?is?a?message").Err()
????if?err?!=?nil?{
????????panic(err)
????}
}

訂閱消息

訂閱消息的方法為Subscribe,訂閱之后通過(guò)返回的句柄調(diào)用ReceiveMessage()方法接收消息:

package?main
import?(
?"context"
?"fmt"
?"github.com/redis/go-redis/v9"
)
func?main()?{
?rdb?:=?redis.NewClient(&redis.Options{
??Addr:?"localhost:6379",
?})
?ctx?:=?context.Background()
?pubsub?:=?rdb.Subscribe(ctx,?"mychannel")
?defer?pubsub.Close()
??//接收消息
?for?{
??msg,?err?:=?pubsub.ReceiveMessage(ctx)
??if?err?!=?nil?{
???panic(err)
??}
??fmt.Printf("從%s渠道接受到%s",?msg.Channel,?msg.Payload)
?}
}

小結(jié)

在本文中,我們講解用github.com/redis/go-redis連接和操作Redis的基本操作,其實(shí)這個(gè)庫(kù)支持很多高級(jí)的功能,比如哨兵,集群、分片等功能,以后在別的文章再講解吧。

以上就是重學(xué)Go語(yǔ)言之如何使用Redis的詳細(xì)內(nèi)容,更多關(guān)于Go Redis的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言strings.Repeat中5個(gè)高效用法(附性能對(duì)比)

    Go語(yǔ)言strings.Repeat中5個(gè)高效用法(附性能對(duì)比)

    本文深入探討Go語(yǔ)言中strings.Repeat的5個(gè)高效用法,包括CLI工具視覺(jué)增強(qiáng)、測(cè)試數(shù)據(jù)生成、文本對(duì)齊優(yōu)化、二進(jìn)制協(xié)議處理及性能優(yōu)化場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • Golang實(shí)現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map

    Golang實(shí)現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map

    在項(xiàng)目實(shí)踐中,有時(shí)候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來(lái)介紹下常用的兩種轉(zhuǎn)換方式,希望對(duì)大家有所幫助
    2023-01-01
  • Golang中閉包與常用場(chǎng)景詳解

    Golang中閉包與常用場(chǎng)景詳解

    在很多的開(kāi)源項(xiàng)目里,經(jīng)??吹介]包的運(yùn)用,這篇文章主要為大家簡(jiǎn)要記錄一下閉包的概念和一些常用的場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • go進(jìn)行http請(qǐng)求偶發(fā)EOF問(wèn)題分析

    go進(jìn)行http請(qǐng)求偶發(fā)EOF問(wèn)題分析

    go使用連接池進(jìn)行http請(qǐng)求,一般都能請(qǐng)求成功,但偶然會(huì)出現(xiàn)請(qǐng)求失敗返回EOF錯(cuò)誤的情況,本文主要來(lái)帶大家分析一下為什么會(huì)出現(xiàn)這樣的問(wèn)題并提供解決方法,需要的可以參考下
    2025-01-01
  • Go 常量基礎(chǔ)概念(聲明更改只讀)

    Go 常量基礎(chǔ)概念(聲明更改只讀)

    這篇文章主要為大家介紹了Go常量基礎(chǔ)概念包括常量的聲明更改只讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 淺談Golang 切片(slice)擴(kuò)容機(jī)制的原理

    淺談Golang 切片(slice)擴(kuò)容機(jī)制的原理

    我們知道 Golang 切片在容量不足的情況下會(huì)進(jìn)行擴(kuò)容,擴(kuò)容的原理是怎樣的呢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Go語(yǔ)言中DateTime的用法介紹

    Go語(yǔ)言中DateTime的用法介紹

    這篇文章介紹了Go語(yǔ)言中DateTime的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼

    golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼

    本文主要介紹了golang Git Hook自動(dòng)化實(shí)現(xiàn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Go信號(hào)處理如何優(yōu)雅地關(guān)閉你的應(yīng)用

    Go信號(hào)處理如何優(yōu)雅地關(guān)閉你的應(yīng)用

    Go?中的優(yōu)雅關(guān)閉機(jī)制使得在應(yīng)用程序接收到終止信號(hào)時(shí),能夠進(jìn)行平滑的資源清理,通過(guò)使用?context?來(lái)管理?goroutine?的生命周期,結(jié)合?signal?包捕獲系統(tǒng)信號(hào),你可以在?Go?應(yīng)用中實(shí)現(xiàn)一個(gè)健壯且優(yōu)雅的關(guān)閉過(guò)程,對(duì)Go關(guān)閉應(yīng)用相關(guān)操作感興趣的朋友一起看看吧
    2025-01-01
  • go交叉編譯sqlite報(bào)錯(cuò)問(wèn)題解決分析

    go交叉編譯sqlite報(bào)錯(cuò)問(wèn)題解決分析

    這篇文章主要為大家介紹了go交叉編譯sqlite報(bào)錯(cuò)問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評(píng)論

虎林市| 逊克县| 无极县| 灵台县| 开鲁县| 禄劝| 南京市| 武安市| 吕梁市| 罗山县| 平度市| 衡水市| 新野县| 绥芬河市| 青阳县| 漳州市| 台安县| 黔江区| 萨嘎县| 冕宁县| 布尔津县| 乾安县| 临沂市| 五家渠市| 桃源县| 佛坪县| 宜城市| 长武县| 连江县| 诏安县| 鹿泉市| 怀宁县| 东乌| 辽宁省| 会同县| 汕尾市| 临江市| 澳门| 镇坪县| 微山县| 清涧县|