Go 原生的互斥锁即 sync 包下的 Mutex 结构体,利用此结构体的 Lock 以及 Unlock 方法能够实现锁的占据以及释放。
关于 sync.Mutex,我们可以总结出如下的特性:
Go 语言中 sync.Mutex 的特性与 Java 中 java.util.concurrent.locks.Lock 相比,API 语义简单不少,这也符合 Go 语言对于简单化的追求。
下面看看本项目-基于 Redis 的分布式锁能够提供哪些分布锁特性。
github-redisLock 是一个基于 go-redis/redis 客户端的 Redis 分布式锁。其拥有的如下的特性:
github-redisLock 同时不支持如下特性:
Install redisLock:
go get github.com/Spongecaptain/redisLock
Create redis client:
import(
"github.com/go-redis/redis"
)
var redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set DB: 0, // use default DB })
Create redisLock:
key := "reids-lock-key"
value := "redis-lock-value"
lock := redisLock.NewRedisLock(redisClient, key, value)
err := lock.Lock()
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("get redis lock success")
defer func() {
err = lock.Unlock()
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("release redis lock success")
}()
(1)构造分布式锁实例
利用 NewRedisLock 以及 NewRedisLockWithExpireTime 函数能够构造出一个分布式锁实例,NewRedisLockWithExpireTime 的区别在于其能够自定义锁的过期时间。
NewRedisLock 方法接收的 key 决定了分布式锁的粒度,value 决定了只有 value 值相同才能够进行解锁。
(2)TryLock
TryLock 仅尝试一次锁的获取,如果失败,那么不会阻塞,直接返回。
(3)Lock
Lock 会不断尝试索取分布式锁,这会导致调用此方法的协程阻塞。
(4)Unlock
Unlock 方法用于解锁,由于涉及网络通信,解锁可能失败, error!=nil 意味着解锁失败。
(5)LockWithTimeout
Lock 方法会在获取锁资源成功或者超时后返回。
(6)SpinLock
支持指定次数地进行自旋式的锁获取。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://spongecaptain.cool/post/go/redislock/
内容来源于网络,如有侵权,请联系作者删除!