分布式锁
#
接口定义为了方便适配不同的分布式锁接入,这里定义了2个必要的接口
type Lock interface { Lock (ctx context.Context) (bool, error) Unlock(ctx context.Context) (bool, error)}
#
Redis实现方式目前默认支持redis实现的分布式锁,为了防止出现死锁的情况,加入了超时参数, Unlock
时使用Lua脚本实现了原子性操作,防止误删除。
#
Redis锁使用方式// github.com/go-eagle/eagle/pkg/lock/redis.go
// 实例化锁// 不带超时时间,默认2slock := NewLock(redis.RedisClient, "test:lock")// 自定义超时时间lock := NewLock(redis.RedisClient, "test:lock", WithTimeout(3*time.Second))
ctx := context.Background()
// 加锁ok, err := lock.Lock(ctx)if err != nil { // 处理错误}if ok { // 处理业务逻辑}
// 释放锁ok, err = lock.Unlock(ctx)if err != nil { // 处理错误}if ok { // 处理业务逻辑}