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