2025-08-08 15:27:51 +08:00
|
|
|
package diagram
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
|
|
|
|
|
locker "modelRT/distributedlock"
|
|
|
|
|
"modelRT/logger"
|
|
|
|
|
|
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// RedisString defines the encapsulation struct of redis string type
|
|
|
|
|
type RedisString struct {
|
|
|
|
|
ctx context.Context
|
|
|
|
|
rwLocker *locker.RedissionRWLocker
|
|
|
|
|
storageClient *redis.Client
|
|
|
|
|
logger *zap.Logger
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewRedisString define func of new redis string instance
|
|
|
|
|
func NewRedisString(ctx context.Context, stringKey string, token string, lockLeaseTime uint64, needRefresh bool) *RedisString {
|
|
|
|
|
return &RedisString{
|
|
|
|
|
ctx: ctx,
|
|
|
|
|
rwLocker: locker.InitRWLocker(stringKey, token, lockLeaseTime, needRefresh),
|
|
|
|
|
storageClient: GetRedisClientInstance(),
|
|
|
|
|
logger: logger.GetLoggerInstance(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get define func of get the value of key
|
|
|
|
|
func (rs *RedisString) Get(stringKey string) (string, error) {
|
|
|
|
|
err := rs.rwLocker.RLock(rs.ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "lock rLock by stringKey failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
defer rs.rwLocker.UnRLock(rs.ctx)
|
|
|
|
|
|
|
|
|
|
value, err := rs.storageClient.Get(rs.ctx, stringKey).Result()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "get string value by key failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set define func of set the value of key
|
|
|
|
|
func (rs *RedisString) Set(stringKey string, value interface{}) error {
|
|
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "lock wLock by stringKey failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
|
|
|
|
|
|
|
|
|
err = rs.storageClient.Set(rs.ctx, stringKey, value, redis.KeepTTL).Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "get string value by key failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Incr define func of increments the number stored at key by one
|
|
|
|
|
func (rs *RedisString) Incr(stringKey string) error {
|
|
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "lock wLock by stringKey failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
|
|
|
|
|
|
|
|
|
err = rs.storageClient.Incr(rs.ctx, stringKey).Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "incr the number stored at key by one failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IncrBy define func of increments the number stored at key by increment
|
|
|
|
|
func (rs *RedisString) IncrBy(stringKey string, value int64) error {
|
|
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "lock wLock by stringKey failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
|
|
|
|
|
|
|
|
|
err = rs.storageClient.IncrBy(rs.ctx, stringKey, value).Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "incr the number stored at key by increment", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2025-08-21 17:04:10 +08:00
|
|
|
|
|
|
|
|
// GETDEL define func of get the value of key and delete the key
|
|
|
|
|
func (rs *RedisString) GETDEL(stringKey string) error {
|
|
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "lock wLock by stringKey failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
|
|
|
|
|
|
|
|
|
err = rs.storageClient.GetDel(rs.ctx, stringKey).Err()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error(rs.ctx, "del the key failed", "string_key", stringKey, "error", err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|