first commit

This commit is contained in:
2026-09-11 01:41:52 +08:00
commit 9f22e6ccae
263 changed files with 28935 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
package redisdao
import (
"context"
"time"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
"github.com/redis/go-redis/v9"
)
// unlockScript 仅当锁值匹配时才删除,防止误删其他持有者的锁
var unlockScript = redis.NewScript(`
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
else
return 0
end
`)
// TryLock 尝试获取分布式锁(SET NX EX),获取成功返回 true。
// value 建议传唯一标识(如 request_id / uuid),用于释放时校验持有者。
func TryLock(ctx context.Context, key, value string, ttl time.Duration) (bool, error) {
ctx, span := global.Tracer.Start(ctx, "redisdao.TryLock")
defer span.End()
ok, err := global.RedisEngine.SetNX(ctx, key, value, ttl).Result()
if err != nil {
span.RecordError(err)
return false, err
}
return ok, nil
}
// Unlock 释放分布式锁,仅当 value 匹配时才删除;锁不存在或不属于自己时静默返回。
func Unlock(ctx context.Context, key, value string) error {
ctx, span := global.Tracer.Start(ctx, "redisdao.Unlock")
defer span.End()
if err := unlockScript.Run(ctx, global.RedisEngine, []string{key}, value).Err(); err != nil {
span.RecordError(err)
return err
}
return nil
}