package diagram import ( "context" "fmt" locker "modelRT/distributedlock" "modelRT/logger" "github.com/redis/go-redis/v9" "go.uber.org/zap" ) // RedisSet defines the encapsulation struct of redis hash type type RedisSet struct { ctx context.Context rwLocker *locker.RedissionRWLocker storageClient *redis.Client logger *zap.Logger } // NewRedisSet define func of new redis set instance func NewRedisSet(ctx context.Context, setKey string, lockLeaseTime uint64, needRefresh bool) *RedisSet { token := ctx.Value("client_token").(string) return &RedisSet{ ctx: ctx, rwLocker: locker.InitRWLocker(setKey, token, lockLeaseTime, needRefresh), storageClient: GetRedisClientInstance(), logger: logger.GetLoggerInstance(), } } // SADD define func of add redis set by members func (rs *RedisSet) SADD(setKey string, members ...interface{}) error { err := rs.rwLocker.WLock(rs.ctx) if err != nil { logger.Error(rs.ctx, "lock wLock by setKey failed", "set_key", setKey, "error", err) return err } defer rs.rwLocker.UnWLock(rs.ctx) err = rs.storageClient.SAdd(rs.ctx, setKey, members).Err() if err != nil { logger.Error(rs.ctx, "add set by memebers failed", "set_key", setKey, "members", members, "error", err) return err } return nil } // SREM define func of remove the specified members from redis set by key func (rs *RedisSet) SREM(setKey string, members ...interface{}) error { err := rs.rwLocker.WLock(rs.ctx) if err != nil { logger.Error(rs.ctx, "lock wLock by setKey failed", "set_key", setKey, "error", err) return err } defer rs.rwLocker.UnWLock(rs.ctx) count, err := rs.storageClient.SRem(rs.ctx, setKey, members).Result() if err != nil || count != int64(len(members)) { logger.Error(rs.ctx, "rem members from set failed", "set_key", setKey, "members", members, "error", err) return fmt.Errorf("rem members from set failed:%w", err) } return nil } // SMembers define func of get all memebers from redis set by key func (rs *RedisSet) SMembers(setKey string) ([]string, error) { err := rs.rwLocker.RLock(rs.ctx) if err != nil { logger.Error(rs.ctx, "lock rLock by setKey failed", "set_key", setKey, "error", err) return nil, err } defer rs.rwLocker.UnRLock(rs.ctx) result, err := rs.storageClient.SMembers(rs.ctx, setKey).Result() if err != nil { logger.Error(rs.ctx, "get all set field by hash key failed", "set_key", setKey, "error", err) return nil, err } return result, nil } // SIsMember define func of determine whether an member is in set by key func (rs *RedisSet) SIsMember(setKey string, member interface{}) (bool, error) { result, err := rs.storageClient.SIsMember(rs.ctx, setKey, member).Result() if err != nil { logger.Error(rs.ctx, "get all set field by hash key failed", "set_key", setKey, "error", err) return false, err } return result, nil }