RLock 是一个使用 Redis 实现的分布式锁库。它允许多个进程或线程在分布式系统中安全地协同工作,以确保一次只有一个执行者可以持有锁。
- 分布式锁定:通过 Redis 实现跨多个节点的锁定机制。
- 可配置的锁定时间:可以设置最大锁定时间,防止死锁。
- 时钟漂移考虑:考虑到时钟漂移,增加锁定的稳定性。
- 重试机制:在无法获得锁时,提供了重试获取锁的机制。
- 随机字符串生成:为每个锁生成唯一标识,确保锁的唯一性。
首先,需要创建一个 RLock 实例。可以通过提供一组 Redis 客户端实例来完成。
clients := []*redis.Client{...} // Redis 客户端实例列表
rlock, err := NewRLock(clients)
if err != nil {
// 处理错误
}
可以通过选项函数来配置 RLock 实例:
- WithMaxLockTime(maxLockTime time.Duration) 设置最大锁定时间。
- WithLimit(limit int) 设置并发限制。
- WithLockID(lockID string) 设置锁的唯一标识。
- WithClockDrift(drift float64) 设置时钟漂移容忍度。
- WithRetryTimes(retry int) 设置重试次数。
ttl := 10 * time.Second // 锁定时间
ctx := context.Background()
leftTTL, err := rlock.Lock(ctx, "my-lock-key", ttl)
if err != nil {
// 处理错误
}
// 成功获取锁,leftTTL 是剩余的锁定时间
err := rlock.Unlock(ctx, "my-lock-key")
if err != nil {
// 处理错误
}
// 成功释放锁
确保 Redis 客户端列表的数量为奇数,以避免脑裂问题。 锁定时间不应该过长,以免影响系统性能。 使用分布式锁时,务必确保所有操作都是幂等的。
RLock 是在 MIT 许可下发布的。有关详细信息,请查看 LICENSE 文件。