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)分布式會話管理。這樣可以避免單點故障,并且能夠輕松地實現(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ù)、文章點贊數(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ù)器的地址,包括主機和端口號。在這里是本地主機的默認(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”,指定了要進行自增操作的鍵名。
自增設(shè)定的整數(shù)
i2, err := rdb.IncrBy(ctx, "inckey", 2).Result() fmt.Println("IncrBy自增后的值", i2) //3
字段說明
上下文(context)
:在 Go 中,上下文用于控制請求的生命周期,包括取消請求和設(shè)置超時時間等。要自增的鍵名
:“inckey”,指定了要進行自增操作的鍵名。自增的整數(shù)值
:這里是 2,表示要將鍵的值增加 2。
將鍵的值自增指定的浮點數(shù)
i3, err := rdb.IncrByFloat(ctx, "inckey", 2.2).Result() fmt.Println("IncrByFloat自增后的值", i3) //5.2
字段說明
上下文(context)
:在 Go 中,上下文用于控制請求的生命周期,包括取消請求和設(shè)置超時時間等。要自增的鍵名
:“inckey”,指定了要進行自增操作的鍵名。自增的浮點數(shù)值
:這里是 2.2,表示要將鍵的值增加 2.2。
刪除指定的鍵
rdb.Del(ctx, "key1")
字段說明
上下文(context)
:在 Go 中,上下文用于控制請求的生命周期,包括取消請求和設(shè)置超時時間等。要刪除的鍵名
:“key1”,指定了要進行刪除操作的鍵名。
批量刪除多個鍵
err = rdb.Del(ctx, "key2", "key3").Err() if err != nil { panic(err) }
字段說明
上下文(context)
:在 Go 中,上下文用于控制請求的生命周期,包括取消請求和設(shè)置超時時間等。要刪除的多個鍵名
:“key2”, “key3”,指定了要進行刪除操作的鍵名列表。
設(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è)置會進行覆蓋 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è)定的浮點數(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)文章
淺析Golang開發(fā)中g(shù)oroutine的正確使用姿勢
很多初級的Gopher在學(xué)習(xí)了goroutine之后,在項目中其實使用率不高,所以這篇文章小編主要來帶大家深入了解一下goroutine的常見使用方法,希望對大家有所幫助2024-03-03golang如何使用gomobile進行Android開發(fā)
golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進行Android開發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01