modelRT/diagram/redis_string.go

98 lines
2.9 KiB
Go
Raw Normal View History

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
}