Redsync
Redsync 提供了一个基于 Redis 的分布式互斥锁实现,适用于 Go 语言,如这篇文章所述。Ruby 版本的参考库(由 antirez 开发)可在 github.com/antirez/redlock-rb 找到。
安装
使用 go get 命令安装 Redsync:
$ go get github.com/go-redsync/redsync/v4
将安装两个驱动程序实现;但只有使用的那个会包含在你的项目中。
请查看 examples 文件夹了解每个驱动程序的用法。
文档
使用方法
为了简化示例,错误处理使用 panic
。
package main
import (
goredislib "github.com/redis/go-redis/v9"
"github.com/go-redsync/redsync/v4"
"github.com/go-redsync/redsync/v4/redis/goredis/v9"
)
func main() {
// 创建一个 go-redis(或 redigo)连接池,这是 redisync 与 Redis 通信时使用的池。
// 也可以是任何实现了 `redis.Pool` 接口的池。
client := goredislib.NewClient(&goredislib.Options{
Addr: "localhost:6379",
})
pool := goredis.NewPool(client) // 或者 pool := redigo.NewPool(...)
// 创建一个 redisync 实例,用于获取互斥锁。
rs := redsync.New(pool)
// 通过为所有需要相同锁的实例使用相同的名称来获取新的互斥锁。
mutexname := "my-global-mutex"
mutex := rs.NewMutex(mutexname)
// 为给定的互斥锁获取锁。成功后,其他人无法获得相同的锁(相同的互斥锁名称),直到我们解锁。
if err := mutex.Lock(); err != nil {
panic(err)
}
// 执行需要锁的工作。
// 释放锁,以便其他进程或线程可以获得锁。
if ok, err := mutex.Unlock(); !ok || err != nil {
panic("unlock failed")
}
}
贡献
欢迎贡献。
许可证
Redsync 基于 BSD(3-Clause)许可证 发布。
免责声明
此代码实现了一个当前处于提议阶段的算法,尚未经过正式分析。在生产环境中使用之前,请确保理解其工作原理。
实际应用
以下是使用 Redsync 的公开开源项目列表:
- Sourcegraph:通用代码搜索和智能平台。在内部缓存实现中使用 Redsync。
- Open Match(由 Google 开发):灵活、可扩展和可扩展的视频游戏匹配系统。在其状态存储实现中使用 Redsync。
- Gocron(由 go-co-op 开发):gocron 是一个分布式作业调度包,允许你使用简单、人性化的语法在预定间隔运行 Go 函数。在其分布式作业调度器实现中使用 Redsync。
如果你在项目中使用 Redsync,请发送拉取请求将其添加到列表中。