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