golang操作Redis的實(shí)現(xiàn)示例
Redis的作用
Redis(Remote Dictionary Server)是一個(gè)開(kāi)源的內(nèi)存數(shù)據(jù)庫(kù),它主要用于存儲(chǔ)鍵值對(duì),并提供多種數(shù)據(jù)結(jié)構(gòu)的支持。Redis 的主要作用包括:
- 1.
緩存
: Redis 可以作為緩存系統(tǒng),將常用的數(shù)據(jù)緩存在內(nèi)存中,以提高數(shù)據(jù)訪問(wèn)速度。由于 Redis 是基于內(nèi)存的,所以讀取速度非???,適用于需要快速訪問(wèn)的場(chǎng)景,如網(wǎng)頁(yè)緩存、API 響應(yīng)緩存等。 - 2.
會(huì)話(huà)存儲(chǔ)
: 可以將用戶(hù)會(huì)話(huà)信息存儲(chǔ)在 Redis 中,實(shí)現(xiàn)分布式會(huì)話(huà)管理。這樣可以避免單點(diǎn)故障,并且能夠輕松地實(shí)現(xiàn)會(huì)話(huà)共享和負(fù)載均衡。 - 3.
消息隊(duì)列
: Redis 支持發(fā)布訂閱(Pub/Sub)模式,可以用作簡(jiǎn)單的消息隊(duì)列系統(tǒng)。發(fā)布者將消息發(fā)布到特定的頻道,而訂閱者則可以訂閱這些頻道以接收消息。這使得 Redis 在異步通信、任務(wù)隊(duì)列等場(chǎng)景中非常有用。 - 4.
計(jì)數(shù)器和排行榜
: Redis 的原子計(jì)數(shù)器和有序集合功能可用于實(shí)現(xiàn)計(jì)數(shù)器和排行榜功能。比如統(tǒng)計(jì)網(wǎng)站訪問(wèn)次數(shù)、文章點(diǎn)贊數(shù)、用戶(hù)積分排行等。 - 5.
分布式鎖
: Redis 的 SETNX 和 EXPIRE 命令結(jié)合可以實(shí)現(xiàn)分布式鎖,用于控制多個(gè)客戶(hù)端對(duì)共享資源的訪問(wèn),防止出現(xiàn)競(jìng)態(tài)條件。 - 6.
持久化
: Redis 支持多種持久化方式,包括快照(snapshot)和日志(append-only file),可以將內(nèi)存中的數(shù)據(jù)定期或?qū)崟r(shí)地保存到磁盤(pán)上,以防止數(shù)據(jù)丟失。 - 7.
地理空間數(shù)據(jù)處理
: Redis 支持地理空間數(shù)據(jù)類(lèi)型(Geo),可以存儲(chǔ)經(jīng)緯度信息,并提供相關(guān)的距離計(jì)算、地理位置查詢(xún)等功能。
總的來(lái)說(shuō),Redis 是一個(gè)功能豐富的內(nèi)存數(shù)據(jù)庫(kù),可以用于多種場(chǎng)景,包括緩存、會(huì)話(huà)存儲(chǔ)、消息隊(duì)列、計(jì)數(shù)器和排行榜、分布式鎖等,為應(yīng)用程序提供高性能、高可用的數(shù)據(jù)存儲(chǔ)和處理能力。
go實(shí)現(xiàn)
那怎么使用go語(yǔ)言實(shí)現(xiàn)Redis的基本操作呢?下面寸鐵帶你手把手實(shí)現(xiàn)!
建立redis連接
var rdb *redis.Client // 建立redis連接 func init() { rdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) }
字段說(shuō)明
Addr
: 指定 Redis 服務(wù)器的地址,包括主機(jī)和端口號(hào)。在這里是本地主機(jī)的默認(rèn) Redis 端口 6379。Password
: Redis 服務(wù)器的訪問(wèn)密碼,如果 Redis 設(shè)置了密碼,需要在此處填入密碼。DB
: 指定連接的 Redis 數(shù)據(jù)庫(kù)編號(hào)。Redis 支持多個(gè)數(shù)據(jù)庫(kù),默認(rèn)使用的是第一個(gè)數(shù)據(jù)庫(kù)編號(hào)為 0。
設(shè)置指定鍵的值
ctx := context.Background() err := rdb.Set(ctx, "rediskey", "redisvalue", 0).Err() if err != nil { panic(err) }
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。鍵名
:“rediskey”,指定要設(shè)置的鍵名。鍵值
:“redisvalue”,指定要設(shè)置的鍵值。過(guò)期時(shí)間
:0,表示該鍵永不過(guò)期。
獲取指定鍵的值
getres, err := rdb.Get(ctx, "rediskey").Result() if err != nil { panic(err) } fmt.Println("get執(zhí)行的result", getres)
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。鍵名
:“rediskey”,指定要獲取值的鍵名。
執(zhí)行原生的 Redis 命令
dores, err := rdb.Do(ctx, "GET", "rediskey").Result() if err != nil { panic(err) } fmt.Println("do get 執(zhí)行的result", dores.(string))
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。Redis 命令
:“GET”,指定要執(zhí)行的 Redis 命令是 GET。命令參數(shù)
:“rediskey”,指定 GET 命令的鍵名。
設(shè)置指定鍵的值,并返回鍵的舊值
oldres, err := rdb.GetSet(ctx, "rediskey", "newvalue").Result() if err != nil { panic(err) } fmt.Println("GetSet執(zhí)行的result", oldres) // redisvalue
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。鍵名
:“rediskey”,指定要設(shè)置值的鍵名。新值
:“newvalue”,指定要設(shè)置的新值。
鍵不存在時(shí)設(shè)置鍵的值
err = rdb.SetNX(ctx, "key3", "value3", 0).Err() if err != nil { panic(err) }
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。鍵名
:“key3”,指定要設(shè)置值的鍵名。值
:“value3”,指定要設(shè)置的值。超時(shí)時(shí)間
:0,表示不設(shè)置超時(shí)時(shí)間。
批量獲取多個(gè)鍵的值
result, err := rdb.MGet(ctx, "key1", "key2", "key3").Result() if err != nil { panic(err) } fmt.Println(result)
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要獲取值的鍵名
:“key1”, “key2”, “key3”,指定了要獲取值的多個(gè)鍵名。
批量設(shè)置多個(gè)鍵的值
setKey := rdb.MSet(ctx, "key1", "value1", "key2", "value2", "key3", "value3") if err != nil { panic(err) } fmt.Println(setKey)
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要設(shè)置值的鍵值對(duì)
:“key1”, “value1”, “key2”, “value2”, “key3”, “value3”,這里同時(shí)設(shè)置了多個(gè)鍵值對(duì)。
將鍵的值自增 1
i, err := rdb.Incr(ctx, "inckey").Result() fmt.Println("Incr自增后的值:", i) //1
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要自增的鍵名
:“inckey”,指定了要進(jìn)行自增操作的鍵名。
自增設(shè)定的整數(shù)
i2, err := rdb.IncrBy(ctx, "inckey", 2).Result() fmt.Println("IncrBy自增后的值", i2) //3
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要自增的鍵名
:“inckey”,指定了要進(jìn)行自增操作的鍵名。自增的整數(shù)值
:這里是 2,表示要將鍵的值增加 2。
將鍵的值自增指定的浮點(diǎn)數(shù)
i3, err := rdb.IncrByFloat(ctx, "inckey", 2.2).Result() fmt.Println("IncrByFloat自增后的值", i3) //5.2
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要自增的鍵名
:“inckey”,指定了要進(jìn)行自增操作的鍵名。自增的浮點(diǎn)數(shù)值
:這里是 2.2,表示要將鍵的值增加 2.2。
刪除指定的鍵
rdb.Del(ctx, "key1")
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要?jiǎng)h除的鍵名
:“key1”,指定了要進(jìn)行刪除操作的鍵名。
批量刪除多個(gè)鍵
err = rdb.Del(ctx, "key2", "key3").Err() if err != nil { panic(err) }
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要?jiǎng)h除的多個(gè)鍵名
:“key2”, “key3”,指定了要進(jìn)行刪除操作的鍵名列表。
設(shè)置指定鍵的過(guò)期時(shí)間
rdb.Expire(ctx, "key", 10*time.Second)
字段說(shuō)明
上下文(context)
:在 Go 中,上下文用于控制請(qǐng)求的生命周期,包括取消請(qǐng)求和設(shè)置超時(shí)時(shí)間等。要設(shè)置過(guò)期時(shí)間的鍵名
:“key”,指定了要設(shè)置過(guò)期時(shí)間的鍵名。過(guò)期時(shí)間
:這里是 10 秒,表示在當(dāng)前時(shí)間的基礎(chǔ)上,鍵 “key” 會(huì)在 10 秒后過(guò)期失效。
demo
package main import ( "context" "fmt" "github.com/go-redis/redis/v8" "time" ) // 建立redis連接 func init() { rdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) } func main() { ctx := context.Background() err := rdb.Set(ctx, "rediskey", "redisvalue", 0).Err() if err != nil { panic(err) } getres, err := rdb.Get(ctx, "rediskey").Result() if err != nil { panic(err) } fmt.Println("get執(zhí)行的result", getres) //redisvalue //使用DO 原生的操作 dores, err := rdb.Do(ctx, "GET", "rediskey").Result() if err != nil { panic(err) } fmt.Println("do get 執(zhí)行的result", dores.(string)) //redisvalue //即使設(shè)置新的值 取到的是舊的值 但是在redis中是設(shè)置了新的值 oldres, err := rdb.GetSet(ctx, "rediskey", "newvalue").Result() if err != nil { panic(err) } fmt.Println("GetSet執(zhí)行的result", oldres) //redisvalue //存在則不設(shè)置該值 不存在則設(shè)置該值 err = rdb.SetNX(ctx, "key3", "value3", 0).Err() if err != nil { panic(err) } //批量取出鍵的值 result, err := rdb.MGet(ctx, "key1", "key2", "key3").Result() if err != nil { panic(err) } fmt.Println(result) //批量設(shè)置鍵的值 類(lèi)似Map 對(duì)于同一個(gè)鍵的值 再設(shè)置會(huì)進(jìn)行覆蓋 setKey := rdb.MSet(ctx, "key1", "value1", "key2", "value2", "key3", "value3") if err != nil { panic(err) } fmt.Println(setKey) //自增1 i, err := rdb.Incr(ctx, "inckey").Result() fmt.Println("Incr自增后的值:", i) //1 //自增設(shè)定的整數(shù) i2, err := rdb.IncrBy(ctx, "inckey", 2).Result() fmt.Println("IncrBy自增后的值", i2) //3 //自增設(shè)定的浮點(diǎn)數(shù) i3, err := rdb.IncrByFloat(ctx, "inckey", 2.2).Result() fmt.Println("IncrByFloat自增后的值", i3) //5.2 //自減1 i4, err := rdb.Decr(ctx, "inckey").Result() fmt.Println("Incr自增后的值:", i4) //0 3-->2 //自減設(shè)定的整數(shù) i5, err := rdb.DecrBy(ctx, "inckey", 2).Result() fmt.Println("IncrBy自增后的值", i5) //0 2-->0 //單個(gè)刪除 rdb.Del(ctx, "key1") //批量刪除 err = rdb.Del(ctx, "key2", "key3").Err() if err != nil { panic(err) } //設(shè)置過(guò)期時(shí)間 10秒鐘后失效 //rdb.Set(ctx, "key", "value", 10*time.Second) rdb.Expire(ctx, "key", 10*time.Second) }
到此這篇關(guān)于golang操作Redis的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang操作Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)自定義recovery中間件
在?Golang?的?Web?項(xiàng)目中,自定義?recovery?中間件是一種常見(jiàn)的做法,用于捕獲并處理應(yīng)用程序的運(yùn)行時(shí)錯(cuò)誤,下面我們就來(lái)看看具體如何實(shí)現(xiàn)吧2023-09-09goland把go項(xiàng)目打包進(jìn)docker鏡像的全過(guò)程記錄
golang編譯的應(yīng)用是不需要依賴(lài)其他運(yùn)行環(huán)境的,下面這篇文章主要給大家介紹了關(guān)于goland把go項(xiàng)目打包進(jìn)docker鏡像的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08基于Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序
tree?命令是一個(gè)小型的跨平臺(tái)命令行程序,用于遞歸地以樹(shù)狀格式列出或顯示目錄的內(nèi)容。本文將通過(guò)Go語(yǔ)言實(shí)現(xiàn)類(lèi)似tree命令的小程序,需要的可以參考一下2022-10-10利用Go語(yǔ)言實(shí)現(xiàn)Raft日志同步
這篇文章主要為大家詳細(xì)介紹了如何利用Go語(yǔ)言實(shí)現(xiàn)Raft日志同步,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以參考一下2023-05-05淺析Golang開(kāi)發(fā)中g(shù)oroutine的正確使用姿勢(shì)
很多初級(jí)的Gopher在學(xué)習(xí)了goroutine之后,在項(xiàng)目中其實(shí)使用率不高,所以這篇文章小編主要來(lái)帶大家深入了解一下goroutine的常見(jiàn)使用方法,希望對(duì)大家有所幫助2024-03-03golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)
golang可以開(kāi)發(fā)android,使用golang開(kāi)發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開(kāi)發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01Golang實(shí)現(xiàn)將視頻按照時(shí)間維度剪切的工具
這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)將視頻按照時(shí)間維度進(jìn)行剪切,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12