go-redis应用
锁封装处理
- Redis 的加锁、等待和释放操作统一封装
RedisLock - 获取、等待、过期和安全释放统一封装起来,业务层只关心“加锁 → 执行业务 → 解锁”
- 释放锁, 使用 Lua 脚本保证安全
- Lua 脚本负责安全地删除锁
- 锁的有效期
- 避免占用锁一直不释放问题
- 释放锁, 使用 Lua 脚本保证安全
业务层使用
lock := redislock.New(
redisClient,
"lock:payment:"+orderID,
10*time.Second,
)
if err := lock.Lock(ctx); err != nil {
return err
}
defer lock.Unlock(ctx)
// 真正业务逻辑
注意问题
- 锁是有有效期的,如果业务执行时间超过 ttl(存活时间),锁会过期,其他客户端可能在原业务结束前拿到锁 需要长任务时,应考虑续期