Redis(遠程字典伺服器)是一種高性能的內存鍵值型資料庫。它可以作為多種應用程序的緩存、資料庫、消息代理和排行榜等。而GoRedis是Golang實現的Redis客戶端,增加了不少方便易用的特性。本文將從多個方面詳細闡述GoRedis的使用。
一、連接Redis資料庫
GoRedis的最基本用法是連接Redis資料庫。連接可以使用以下兩種方式:
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
pong, err := rdb.Ping(ctx).Result()
fmt.Println(pong, err)
}
或者使用連接池:
func main() {
import (
"context"
"fmt"
"time"
"github.com/go-redis/redis/v8"
)
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
DB: 0,
})
defer rdb.Close()
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
pong, err := rdb.Ping(ctx).Result()
fmt.Println(pong, err)
poolSize := 10
maxPoolSize := 30
timeout := 2 * time.Second
rdbPool := &redis.Pool{
MaxIdle: poolSize,
MaxActive: maxPoolSize,
IdleTimeout: timeout,
Dial: func() (redis.Conn, error) {
conn, err := redis.Dial("tcp", "localhost:6379")
if err != nil {
return nil, err
}
return conn, nil
},
}
defer rdbPool.Close()
conn := rdbPool.Get()
defer conn.Close()
pong2, err := redis.String(conn.Do("PING"))
fmt.Println(pong2, err)
}
二、設置和獲取過期時間
Redis的值可以設置過期時間,通過GoRedis也能輕易應用。使用TTL方法獲取一個鍵的剩餘過期時間,EXPIRE和EXPIREAT方法設置, DEL方法刪除這個鍵值即可。
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
err := rdb.Set(ctx, "key", "value", time.Hour).Err()
if err != nil {
panic(err)
}
ttl, err := rdb.TTL(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println(ttl)
err = rdb.Expire(ctx, "key", time.Minute).Err()
if err != nil {
panic(err)
}
err = rdb.ExpireAt(ctx, "key", time.Now().Add(24*time.Hour)).Err()
if err != nil {
panic(err)
}
n, err := rdb.Del(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println(n)
}
三、GoRedis和Redis的數據類型匹配
Redis有多種數據類型,GoRedis也提供了對應的Go語言數據結構相應的API,相對應的數據類型包括:
字元串(Strings)
操作字元串可以使用GET方法獲取整個字元串,SET方法設置。也可以使用SETEX方法設置帶有過期時間的鍵值對,使用APPEND方法增加字元串長度。
哈希(Hashes)
對於哈希,可使用HSET方法設置,HMSET方法設置多組鍵值對。添加、刪除和獲取同理,並且通過HGETALL方法可以獲得哈希表中所有的鍵值對。
列表(Lists)
對於列表,使用LPUSH方法可以在列表前面添加元素,使用RPUSH方法可以在列表尾部添加元素。
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
err := rdb.LPush(ctx, "key", "value", "value2").Err()
if err != nil {
panic(err)
}
err = rdb.RPush(ctx, "key", "value", "value2").Err()
if err != nil {
panic(err)
}
val, err := rdb.LPop(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println(val)
vals, err := rdb.LRange(ctx, "key", 0, -1).Result()
if err != nil {
panic(err)
}
for _, val := range vals {
fmt.Println(val)
}
}
集合(Sets)
對於集合,SET和SADD方法可以添加元素,SPOP方法可以刪除並返回隨機一個元素。
有序集合(Sorted Sets)
對於有序集合,ZADD方法可以添加有序元素的成員和score值,ZRANGE和ZREVRANGE獲取對應元素的區間。
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
err := rdb.ZAdd(ctx, "key", &redis.Z{Score: 1, Member: "value1"}, &redis.Z{Score: 2, Member: "value2"}).Err()
if err != nil {
panic(err)
}
vals, err := rdb.ZRange(ctx, "key", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(vals)
vals, err = rdb.ZRevRange(ctx, "key", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(vals)
}
四、GoRedis的一些高級特性
事務(Transactions)
在GoRedis中,MULTI,EXEC,WATCH方法可以實現事務操作。首先使用WATCH方法監視某個值,當這個值發生變化時,MULTI方法之間的代碼塊才會執行,而EXEC方法會執行MULTI方法塊內的所有操作。
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
err := rdb.Watch(ctx, func(tx *redis.Tx) error {
v, err := tx.Get(ctx, "key").Result()
if err != nil {
return err
}
new := v + "bar"
_, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {
pipe.Set(ctx, "key", new, 0)
return nil
})
if err != nil {
return err
}
return nil
}, "key")
if err != nil {
panic(err)
}
}
發布和訂閱(Pub/Sub)
GoRedis也支持Redis中的發布和訂閱功能。通過Subscrip和Subscribe方法,連接到頻道並接收消息。使用Publish方法發布數據。
import (
"fmt"
"github.com/go-redis/redis/v8"
"time"
)
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
pubsub := rdb.Subscribe(ctx, "channel1")
_, err := pubsub.Receive(ctx)
if err != nil {
panic(err)
}
ch := pubsub.Channel()
go func() {
for msg := range ch {
fmt.Println(msg.Channel, msg.Payload)
}
}()
err = rdb.Publish(ctx, "channel1", "hello").Err()
if err != nil {
panic(err)
}
time.Sleep(time.Second)
_ = pubsub.Close()
_ = rdb.Close()
}
管道(Pipeline)
GoRedis的另一個高級功能是管道。使用該功能可將多個Redis操作組合成一組命令,可以顯著減少網路延遲,並在秒級別執行這些操作。
import "github.com/go-redis/redis/v8"
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
pipe := rdb.Pipeline()
incr := pipe.Incr(ctx, "pipeline_counter")
pipe.Expire(ctx, "pipeline_counter", time.Hour)
_, err := pipe.Exec(ctx)
if err != nil {
panic(err)
}
fmt.Println(incr.Val())
}
結論
本文從連接Redis資料庫,設置和獲取過期時間,GoRedis和Redis的數據類型匹配,GoRedis的一些高級特性等方面詳細闡述了GoRedis的使用方法。GoRedis不僅支持Redis的基本操作,還提供了一些高級特性,如事務、發布和訂閱、管道等。
原創文章,作者:RQXT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133274.html