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

