Redis 锁

概述

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

准备条件

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

说明

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

方法说明

  1. NewRedisLock

    1. 函数签名:
    2. NewRedisLock func(store *Redis, key string) *RedisLock
    3. 说明:
    4. 1. 删除单条记录,同时会清理 key 缓存
    5. 2. 默认过期时间 1500 ms
    6. 入参:
    7. 1. store: redis 实例
    8. 2. key: key
    9. 返回值:
    10. 1. *RedisLock: redis locker 实例
  2. SetExpire

    1. 函数签名:
    2. SetExpire func(seconds int)
    3. 说明:
    4. 1. 设置过期时间
    5. 入参:
    6. 1. seconds: 过期时间,单位
  3. Acquire

    1. 函数签名:
    2. Acquire func() (bool, error)
    3. 说明:
    4. 1. 获取锁
    5. 返回值:
    6. 1. bool: 是否拿到锁
    7. 2. error: 操作error
  4. AcquireCtx

    1. 函数签名:
    2. AcquireCtx func(ctx context.Context) (bool, error)
    3. 说明:
    4. 1. 获取锁
    5. 入参:
    6. 1. ctx: context
    7. 返回值:
    8. 1. bool: 是否拿到锁
    9. 2. error: 操作error
  5. Release

    1. 函数签名:
    2. Release func() (bool, error)
    3. 说明:
    4. 1. 释放锁
    5. 返回值:
    6. 1. bool: 锁是否被主动释放
    7. 2. error: 操作error
  6. ReleaseCtx

    1. 函数签名:
    2. ReleaseCtx func(ctx context.Context) (bool, error)
    3. 说明:
    4. 1. 释放锁
    5. 入参:
    6. 1. ctx: context
    7. 返回值:
    8. 1. bool: 锁是否被主动释放
    9. 2. error: 操作error

使用 demo

  1. {
  2. conf := RedisConf{
  3. Host: "127.0.0.1:55000",
  4. Type: "node",
  5. Pass: "123456",
  6. Tls: false,
  7. }
  8. rds := MustNewRedis(conf)
  9. lock := NewRedisLock(rds, "test")
  10. // 设置过期时间
  11. lock.SetExpire(10)
  12. // 尝试获取锁
  13. acquire, err := lock.Acquire()
  14. switch {
  15. case err != nil:
  16. // deal err
  17. case acquire:
  18. // 获取到锁
  19. defer lock.Release() // 释放锁
  20. // 业务逻辑
  21. case !acquire:
  22. // 没有拿到锁 wait?
  23. }
  24. }