Redis 锁
概述
本章节主要介绍通过 redis 组件,创建分布式锁的使用。
准备条件
- 完成 golang 安装
- 启动 redis 服务
- 完成 redis 连接创建
说明
- 随机版本号,防止过期误释放。
- 可重入,自动续约。
方法说明
- NewRedisLock
函数签名:
NewRedisLock func(store *Redis, key string) *RedisLock
说明:
1. 删除单条记录,同时会清理 key 缓存
2. 默认过期时间 1500 ms
入参:
1. store: redis 实例
2. key: key
返回值:
1. *RedisLock: redis locker 实例 - SetExpire
函数签名:
SetExpire func(seconds int)
说明:
1. 设置过期时间
入参:
1. seconds: 过期时间,单位 秒 - Acquire
函数签名:
Acquire func() (bool, error)
说明:
1. 获取锁
返回值:
1. bool: 是否拿到锁
2. error: 操作error - AcquireCtx
函数签名:
AcquireCtx func(ctx context.Context) (bool, error)
说明:
1. 获取锁
入参:
1. ctx: context
返回值:
1. bool: 是否拿到锁
2. error: 操作error - Release
函数签名:
Release func() (bool, error)
说明:
1. 释放锁
返回值:
1. bool: 锁是否被主动释放
2. error: 操作error - ReleaseCtx
函数签名:
ReleaseCtx func(ctx context.Context) (bool, error)
说明:
1. 释放锁
入参:
1. ctx: context
返回值:
1. bool: 锁是否被主动释放
2. error: 操作error
使用 demo
{
conf := RedisConf{
Host: "127.0.0.1:55000",
Type: "node",
Pass: "123456",
Tls: false,
}
rds := MustNewRedis(conf)
lock := NewRedisLock(rds, "test")
// 设置过期时间
lock.SetExpire(10)
// 尝试获取锁
acquire, err := lock.Acquire()
switch {
case err != nil:
// deal err
case acquire:
// 获取到锁
defer lock.Release() // 释放锁
// 业务逻辑
case !acquire:
// 没有拿到锁 wait?
}
}