Redis 锁

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 实例
  1. SetExpire
函数签名:
    SetExpire func(seconds int)
说明:
    1. 设置过期时间
入参:
    1. seconds: 过期时间,单位 秒
  1. Acquire
函数签名:
    Acquire func() (bool, error)
说明:
    1. 获取锁
返回值:
    1. bool: 是否拿到锁
    2. error: 操作error
  1. AcquireCtx
函数签名:
    AcquireCtx func(ctx context.Context) (bool, error)
说明:
    1. 获取锁
入参:
    1. ctx: context
返回值:
    1. bool: 是否拿到锁
    2. error: 操作error
  1. Release
函数签名:
    Release func() (bool, error)
说明:
    1. 释放锁
返回值:
    1. bool: 锁是否被主动释放
    2. error: 操作error
  1. 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?
    }
}