package rediscontroll import ( "fmt" "main_exam_server/loges" "time" "github.com/go-redis/redis/v8" ) /** *字符串(string)类型操作 */ /* Set():设置 @keyName 键名 @keyVal 键值 @timeVal 过期时间 */ func SetString(rdb *redis.Client, keyName string, keyVal string, timeVal time.Duration) bool { // rdb := RedisInit() err := rdb.Set(ctx, keyName, keyVal, timeVal).Err() if err != nil { errStr := fmt.Sprintf("%v键设置值%v错误:%v", keyName, keyVal, err) loges.LongInit(errStr) return false } return true } /* SetEX():设置并指定过期时间 不管该key是否已经存在缓存中直接覆盖 @keyName 键名 @keyVal 键值 @timeVal 过期时间 */ func SetStringEx(rdb *redis.Client, keyName string, keyVal string, timeVal time.Duration) bool { // rdb := RedisInit() err := rdb.SetEX(ctx, keyName, keyVal, timeVal).Err() if err != nil { errStr := fmt.Sprintf("%v键设置值%v错误:%v", keyName, keyVal, err) loges.LongInit(errStr) return false } return true } /* SetEX():设置并指定过期时间 不管该key是否已经存在缓存中直接覆盖 @keyName 键名 @keyVal 键值 @timeVal 过期时间 call back -1 错误;1:设置失败;2:甚至成功 */ func SetStringNX(rdb *redis.Client, keyName string, keyVal string, timeVal time.Duration) int { // rdb := RedisInit() res, err := rdb.SetNX(ctx, keyName, keyVal, timeVal).Result() if err != nil { errStr := fmt.Sprintf("%v键设置值%v错误:%v", keyName, keyVal, err) loges.LongInit(errStr) return -1 } if res { return 2 } else { return 1 } } /* 获取字符串键值 @keyName 键名 */ func GetString(rdb *redis.Client, keyName string) (val string, istrue bool) { // rdb := RedisInit() val, err := rdb.Get(ctx, keyName).Result() if err == redis.Nil { errStr := fmt.Sprintf("%v键不存在:%v", keyName, err) loges.LongInit(errStr) return "", false } else if err != nil { errStr := fmt.Sprintf("%v键获取错误:%v", keyName, err) loges.LongInit(errStr) return "", false } else { return val, true } } /* 字符串截取 @keyName 键名 @startSubscript 下标索引的开始位置 @endtSubscript 下标索引的结束位置(不是要截取的长度) */ func StringInterception(rdb *redis.Client, keyName string, startSubscript, endtSubscript int64) (val string, istrue bool) { // rdb := RedisInit() valstr, err := rdb.GetRange(ctx, keyName, startSubscript, endtSubscript).Result() if err != nil { errStr := fmt.Sprintf("%v键截取错误:%v", keyName, err) loges.LongInit(errStr) return "", false } return valstr, true } /* string 加一操作 @keyName 键名 */ func StringIncr(rdb *redis.Client, keyName string) (val int64, istrue bool) { // rdb := RedisInit() valstr, err := rdb.Incr(ctx, keyName).Result() if err != nil { errStr := fmt.Sprintf("%v键加一操作错误:%v", keyName, err) loges.LongInit(errStr) return 0, false } return valstr, true } /* string 按指定步长增加 @keyName 键名 @istrue 步长 */ func StringIncrBy(rdb *redis.Client, keyName string, stepval int64) (val int64, istrue bool) { // rdb := RedisInit() valstr, err := rdb.IncrBy(ctx, keyName, stepval).Result() if err != nil { errStr := fmt.Sprintf("%v键加指定步长操作错误:%v", keyName, err) loges.LongInit(errStr) return 0, false } return valstr, true } /* string 减一操作 @keyName 键名 */ func StringDecr(rdb *redis.Client, keyName string) (val int64, istrue bool) { // rdb := RedisInit() valstr, err := rdb.Decr(ctx, keyName).Result() if err != nil { errStr := fmt.Sprintf("%v键减一操作错误:%v", keyName, err) loges.LongInit(errStr) return 0, false } return valstr, true } /* string 按指定步长减少 @keyName 键名 @istrue 步长 */ func StringDecrBy(rdb *redis.Client, keyName string, stepval int64) (val int64, istrue bool) { // rdb := RedisInit() valstr, err := rdb.DecrBy(ctx, keyName, stepval).Result() if err != nil { errStr := fmt.Sprintf("%v键减指定步长操作错误:%v", keyName, err) loges.LongInit(errStr) return 0, false } return valstr, true } /* 往字符串后面追加元素,返回值是字符串和总长度 @keyName 键名 @keyVal 键值 call back 值,值长度,是否操作成功 */ func StringAppend(rdb *redis.Client, keyName, keyVal string) (string, int64, bool) { //判断键是否存在 if ExistsIsTrue(rdb, keyName) != true { return "", 0, false } // rdb := RedisInit() lenght, err := rdb.Append(ctx, keyName, keyVal).Result() //追加 if err != nil { errStr := fmt.Sprintf("%v键追加值操作错误:%v", keyName, err) loges.LongInit(errStr) return "", 0, false } val, isTrue := GetString(rdb, keyName) //获取值 if isTrue != true { return "", 0, false } return val, lenght, isTrue } /* 获取字符串长度 @keyName 键名 */ func GetStrLen(rdb *redis.Client, keyName string) (int64, bool) { //判断键是否存在 if ExistsIsTrue(rdb, keyName) != true { return 0, false } // rdb := RedisInit() lenght, err := rdb.StrLen(ctx, keyName).Result() //获取字符串长度 if err != nil { errStr := fmt.Sprintf("%v键获取长度错误:%v", keyName, err) loges.LongInit(errStr) return 0, false } return lenght, true }