Skip to main content

Redis 锁

概述

本章节主要介绍通过 redis 组件,创建分布式锁的使用。

准备条件

  1. 完成 golang 安装
  2. 启动 redis 服务
  3. 完成 redis 连接创建

说明

  1. 随机版本号,防止过期误释放。
  2. 可重入,自动续约。

方法说明

  1. NewRedisLock
    函数签名: 
    NewRedisLock func(store *Redis, key string) *RedisLock
    说明:
    1. 删除单条记录,同时会清理 key 缓存
    2. 默认过期时间 1500 ms
    入参:
    1. store: redis 实例
    2. key: key
    返回值:
    1. *RedisLock: redis locker 实例
  2. SetExpire
    函数签名: 
    SetExpire func(seconds int)
    说明:
    1. 设置过期时间
    入参:
    1. seconds: 过期时间,单位 秒
  3. Acquire
    函数签名: 
    Acquire func() (bool, error)
    说明:
    1. 获取锁
    返回值:
    1. bool: 是否拿到锁
    2. error: 操作error
  4. AcquireCtx
    函数签名: 
    AcquireCtx func(ctx context.Context) (bool, error)
    说明:
    1. 获取锁
    入参:
    1. ctx: context
    返回值:
    1. bool: 是否拿到锁
    2. error: 操作error
  5. Release
    函数签名: 
    Release func() (bool, error)
    说明:
    1. 释放锁
    返回值:
    1. bool: 锁是否被主动释放
    2. error: 操作error
  6. 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?
}
}