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ì)話存儲(chǔ): 可以將用戶會(huì)話信息存儲(chǔ)在 Redis 中,實(shí)現(xiàn)分布式會(huì)話管理。這樣可以避免單點(diǎn)故障,并且能夠輕松地實(shí)現(xiàn)會(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ù)、用戶積分排行等。 - 5.
分布式鎖: Redis 的 SETNX 和 EXPIRE 命令結(jié)合可以實(shí)現(xiàn)分布式鎖,用于控制多個(gè)客戶端對(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ù)類型(Geo),可以存儲(chǔ)經(jīng)緯度信息,并提供相關(guān)的距離計(jì)算、地理位置查詢等功能。
總的來(lái)說(shuō),Redis 是一個(gè)功能豐富的內(nèi)存數(shù)據(jù)庫(kù),可以用于多種場(chǎng)景,包括緩存、會(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è)置鍵的值 類似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)文章
使用Go語(yǔ)言實(shí)現(xiàn)讀取本地文本文件內(nèi)容
這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)讀取本地文本文件內(nèi)容功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下2025-07-07
golang實(shí)現(xiàn)延遲隊(duì)列(delay queue)的兩種實(shí)現(xiàn)
本文主要介紹了golang實(shí)現(xiàn)延遲隊(duì)列(delay queue)的兩種實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Go語(yǔ)言k8s?kubernetes使用leader?election實(shí)現(xiàn)選舉
這篇文章主要為大家介紹了Go語(yǔ)言?k8s?kubernetes?使用leader?election選舉,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Go語(yǔ)言實(shí)現(xiàn)機(jī)器大小端判斷代碼分享
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)機(jī)器大小端判斷代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-10-10

