micro-account/pkg/cache/common.go

93 lines
2.0 KiB
Go
Raw Normal View History

2025-02-20 08:18:23 +00:00
package cache
import (
"errors"
"fmt"
"github.com/fonchain_enterprise/utils/zap_log"
"strconv"
"time"
"dubbo.apache.org/dubbo-go/v3/common/logger"
"github.com/go-redis/redis"
)
// RedisClient Redis缓存客户端单例
var (
RedisClient *redis.Client
)
var deleteScript = `
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
`
type RedisConfig struct {
RedisDB string
RedisAddr string
RedisPw string
RedisDbName string
}
//LoadRedis 在中间件中初始化redis链接
func LoadRedis(configEnv RedisConfig) {
db, _ := strconv.ParseUint(configEnv.RedisDbName, 10, 64)
client := redis.NewClient(&redis.Options{
Addr: configEnv.RedisAddr,
Password: configEnv.RedisPw,
DB: int(db),
})
_, err := client.Ping().Result()
if err != nil {
logger.Info(err)
panic(err)
}
RedisClient = client
}
//LockConcurrency 锁死并发
func LockConcurrency(key string, value string, ms time.Duration) (bool, error) {
fmt.Println(ms)
setNx := RedisClient.SetNX(key, value, ms)
result, err := setNx.Result()
if err != nil {
zap_log.Error(fmt.Sprintf("锁死加解密的时候redis 失效,err%s,%v", key, err))
//panic(err)
return false, err
}
if result {
zap_log.Info(fmt.Sprintf("新增key存在设置成功%s", key))
} else {
zap_log.Info(fmt.Sprintf("新增key已存在设置失败%s", key))
}
zap_log.Info(fmt.Sprintf("日志%v%v%s", result, err, key))
if setNx.Val() == false {
return false, errors.New("已经被人锁定")
}
return true, nil
}
func Release(key, value string) error {
result, err := RedisClient.Eval(deleteScript, []string{key}, value).Result()
if err != nil {
return err
}
// 判断Lua脚本执行的结果
if result == int64(1) {
fmt.Println("Lock released.")
return nil
} else {
fmt.Println("Failed to release lock, or lock was not held by this client.")
return errors.New("释放失败也可能是超时自动解锁了,请您刷新")
}
}