golang,go,博客,开源,编程
redsync
是一个用 Go 编写的分布式互斥锁(Distributed Mutex)库,基于 Redis 实现。其主要目标是在分布式系统中为多个进程或服务之间提供互斥访问的机制,确保同一时间内只有一个客户端可以访问共享资源。
GitHub 项目地址:👉 https://github.com/go-redsync/redsync
redsync
实现了 Redlock 算法(由 Redis 创始人 antirez 提出),该算法旨在在分布式环境中实现安全、健壮的锁。
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 实例来提高可靠性,可以:
pools := []redsync.Pool{
goredis.NewPool(client1),
goredis.NewPool(client2),
goredis.NewPool(client3),
}
rs := redsync.New(pools...)
Redlock 要求至少多数节点成功加锁才认为锁成功。