releaseLock 释放分布式锁,使用 Lua 脚本确保操作的原子性
(ctx context.Context, lockKey, lockValue string)
| 312 | |
| 313 | // releaseLock 释放分布式锁,使用 Lua 脚本确保操作的原子性 |
| 314 | func (c *lotteryDrawCache) releaseLock(ctx context.Context, lockKey, lockValue string) error { |
| 315 | // Lua 脚本:如果 key 的值等于 lockValue,则删除 key |
| 316 | script := ` |
| 317 | if redis.call("GET", KEYS[1]) == ARGV[1] then |
| 318 | return redis.call("DEL", KEYS[1]) |
| 319 | else |
| 320 | return 0 |
| 321 | end |
| 322 | ` |
| 323 | |
| 324 | result, err := c.client.Eval(ctx, script, []string{lockKey}, lockValue).Result() |
| 325 | if err != nil { |
| 326 | return err |
| 327 | } |
| 328 | |
| 329 | if result.(int64) == 0 { |
| 330 | return errors.New("未能释放锁,可能锁已过期或被其他人释放") |
| 331 | } |
| 332 | |
| 333 | return nil |
| 334 | } |
| 335 | |
| 336 | // generateLotteryDrawKey 生成抽奖活动的缓存键 |
| 337 | func generateLotteryDrawKey(id int) string { |
no outgoing calls
no test coverage detected