跳到主要内容

go-redis应用

锁封装处理​

  • Redis 的加锁、等待和释放操作统一封装RedisLock
  • 获取、等待、过期和安全释放统一封装起来,业务层只关心“加锁 → 执行业务 → 解锁”
    • 释放锁, 使用 Lua 脚本保证安全
      • Lua 脚本负责安全地删除锁
    • 锁的有效期
      • 避免占用锁一直不释放问题

业务层使用​

go
lock := redislock.New(
redisClient,
"lock:payment:"+orderID,
10*time.Second,
)

if err := lock.Lock(ctx); err != nil {
return err
}

defer lock.Unlock(ctx)

// 真正业务逻辑

注意问题​

  • 锁是有有效期的,如果业务执行时间超过 ttl(存活时间),锁会过期,其他客户端可能在原业务结束前拿到锁 需要长任务时,应考虑续期