golang,go,博客,开源,编程

golang每日一库之redsync

Published on with 0 views and 0 comments

redsync 是一个用 Go 编写的分布式互斥锁(Distributed Mutex)库,基于 Redis 实现。其主要目标是在分布式系统中为多个进程或服务之间提供互斥访问的机制,确保同一时间内只有一个客户端可以访问共享资源。

GitHub 项目地址:👉 https://github.com/go-redsync/redsync


核心功能

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),
)

常用配置项说明

配置函数描述
WithExpiry()设置锁的过期时间
WithTries()设置尝试加锁的最大次数
WithRetryDelay()设置每次重试的延迟时间
WithTimeout()设置获取锁的超时时间(不是锁本身过期)

多 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