93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
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("释放失败也可能是超时自动解锁了,请您刷新")
|
||
}
|
||
}
|