golang 每日一庫之 redsync

redsync 是一個用 Go 編寫的分佈式互斥鎖(Distributed Mutex)庫,基於 Redis 實現。其主要目標是在分佈式系統中爲多個進程或服務之間提供互斥訪問的機制,確保同一時間內只有一個客戶端可以訪問共享資源。

核心功能

redsync 實現了 Redlock 算法(由 Redis 創始人 antirez 提出),該算法旨在在分佈式環境中實現安全、健壯的鎖。

基本原理

  1. 使用多個獨立的 Redis 實例。

  2. 客戶端嘗試依次在多數 Redis 節點上設置一個帶過期時間的鎖。

  3. 如果大多數實例成功設置鎖,並且總耗時小於鎖的過期時間,則認爲加鎖成功。

  4. 釋放鎖時,會逐個刪除這些實例上的鎖。

安裝

go get github.com/go-redsync/redsync/v4

示例

package main
import (
    "github.com/go-redsync/redsync/v4"
    "github.com/go-redsync/redsync/v4/redis/goredis/v9"
    "github.com/redis/go-redis/v9"
    "context"
    "time"
    "fmt"
)
func main() {
    // 創建 Redis 客戶端
    client := redis.NewClient(&redis.Options{
        Addr: "localhost:6379",
    })
    // 將 Redis 客戶端適配爲 redsync 使用的接口
    pool := goredis.NewPool(client)
    // 創建 redsync 實例
    rs := redsync.New(pool)
    // 創建一個互斥鎖
    mutex := rs.NewMutex("my-global-lock")
    // 嘗試獲取鎖
    if err := mutex.Lock(); err != nil {
        panic(err)
    }
    fmt.Println("獲取到鎖,執行關鍵任務")
    // 模擬任務執行
    time.Sleep(2 * time.Second)
    // 釋放鎖
    if ok, err := mutex.Unlock(); !ok || err != nil {
        panic("解鎖失敗")
    }
    fmt.Println("鎖已釋放")
}

配置

創建 mutex 時可使用配置函數來自定義行爲:

mutex := rs.NewMutex("lock-name",
    redsync.WithExpiry(10*time.Second),
    redsync.WithTries(5),
    redsync.WithRetryDelay(500*time.Millisecond),
)

常用配置項說明

9RMIvh

多 Redis 實例支持

要使用多個 Redis 實例來提高可靠性,可以:

pools := []redsync.Pool{
    goredis.NewPool(client1),
    goredis.NewPool(client2),
    goredis.NewPool(client3),
}
rs := redsync.New(pools...)

Redlock 要求至少多數節點成功加鎖才認爲鎖成功。

標題:golang 每日一庫之 redsync
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/05/23/1747976315637.html
聯繫:scotttu@163.com

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/AuV4maYslLDEK1vvJeOCpg