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 } // 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 }