使用GoRedis輕鬆實現Redis功能

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-hk/n/133274.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RQXT的頭像RQXT
上一篇 2024-10-03 23:57
下一篇 2024-10-03 23:57

相關推薦

  • Java和Python哪個功能更好

    對於Java和Python這兩種編程語言,究竟哪一種更好?這個問題並沒有一個簡單的答案。下面我將從多個方面來對Java和Python進行比較,幫助讀者了解它們的優勢和劣勢,以便選擇…

    編程 2025-04-29
  • Python每次運行變量加一:實現計數器功能

    Python編程語言中,每次執行程序都需要定義變量,而在實際開發中常常需要對變量進行計數或者累加操作,這時就需要了解如何在Python中實現計數器功能。本文將從以下幾個方面詳細講解…

    編程 2025-04-28
  • 在CentOS上安裝Redis

    Redis是一款非關係型數據庫,它支持多種數據結構,包括字符串、哈希、列表、集合、有序集合等。Redis運行內存內並且支持數據持久化,它還可以應用於緩存、消息隊列等場景。本文將介紹…

    編程 2025-04-28
  • Python strip()函數的功能和用法用法介紹

    Python的strip()函數用於刪除字符串開頭和結尾的空格,包括\n、\t等字符。本篇文章將從用法、功能以及與其他函數的比較等多個方面對strip()函數進行詳細講解。 一、基…

    編程 2025-04-28
  • JPRC – 輕鬆創建可讀性強的 JSON API

    本文將介紹一個全新的 JSON API 框架 JPRC,通過該框架,您可以輕鬆創建可讀性強的 JSON API,提高您的項目開發效率和代碼可維護性。接下來將從以下幾個方面對 JPR…

    編程 2025-04-27
  • 解析spring.redis.cluster.max-redirects參數

    本文將圍繞spring.redis.cluster.max-redirects參數進行詳細闡述,從多個方面解讀它的意義與作用,並給出相應的代碼示例。 一、基礎概念 在介紹sprin…

    編程 2025-04-27
  • 全能的wpitl實現各種功能的代碼示例

    wpitl是一款強大、靈活、易於使用的編程工具,可以實現各種功能。下面將從多個方面對wpitl進行詳細的闡述,每個方面都會列舉2~3個代碼示例。 一、文件操作 1、讀取文件 fil…

    編程 2025-04-27
  • Redis Bitmap用法介紹

    Redis是一款高性能的內存數據庫,支持多種數據類型,其中之一便是bitmap。Redis bitmap(位圖)是一種用二進制位來表示元素是否在集合中的數據結構。由於使用了二進制位…

    編程 2025-04-27
  • SOXER: 提供全面的音頻處理功能的命令行工具

    SOXER是一個命令行工具,提供了強大、靈活、全面的音頻處理功能。同時,SOXER也是一個跨平台的工具,支持在多個操作系統下使用。在本文中,我們將深入了解SOXER這個工具,並探討…

    編程 2025-04-27
  • 使用yum安裝redis

    一、什麼是redis? Redis是一種開源的基於key-value存儲的NoSQL數據庫,它支持多種數據結構的存儲,例如字符串、哈希、列表、集合以及有序集合等。同時,Redis還…

    編程 2025-04-25

發表回復

登錄後才能評論