package diagram import ( "context" "fmt" locker "modelRT/distributedlock" "github.com/redis/go-redis/v9" "go.uber.org/zap" ) // TODO 统一 storageClient与 rwLocker 中使用的 redis 版本 // RedisSet defines the encapsulation struct of redis hash type type RedisSet struct { ctx context.Context rwLocker *locker.RedissionRWLocker storageClient *redis.Client logger *zap.Logger } // SADD define func of add redis set by members func (rs *RedisSet) SADD(setKey string, members ...interface{}) error { err := rs.rwLocker.WLock() if err != nil { rs.logger.Error("lock wLock by setKey failed", zap.String("setKey", setKey), zap.Error(err)) return err } defer rs.rwLocker.UnWLock() err = rs.storageClient.SAdd(rs.ctx, setKey, members).Err() if err != nil { rs.logger.Error("add set by memebers failed", zap.String("setKey", setKey), zap.Any("members", members), zap.Error(err)) return err } return nil } // SREM define func of remove the specified members from redis set by key func (rh *RedisHash) SREM(setKey string, members ...interface{}) error { err := rh.rwLocker.WLock() if err != nil { rh.logger.Error("lock wLock by setKey failed", zap.String("setKey", setKey), zap.Error(err)) return err } defer rh.rwLocker.UnWLock() count, err := rh.storageClient.SRem(rh.ctx, setKey, members).Result() if err != nil || count != int64(len(members)) { rh.logger.Error("rem members from set failed", zap.String("setKey", setKey), zap.Any("members", members), zap.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 (rh *RedisHash) SMembers(setKey string) ([]string, error) { err := rh.rwLocker.RLock() if err != nil { rh.logger.Error("lock rLock by setKey failed", zap.String("setKey", setKey), zap.Error(err)) return nil, err } defer rh.rwLocker.UnRLock() result, err := rh.storageClient.SMembers(rh.ctx, setKey).Result() if err != nil { rh.logger.Error("get all hash field by hash key failed", zap.String("setKey", setKey), zap.Error(err)) return nil, err } return result, nil } // SIsMember define func of determine whether an member is in set by key func (rh *RedisHash) SIsMember(setKey string, member interface{}) (bool, error) { err := rh.rwLocker.RLock() if err != nil { rh.logger.Error("lock rLock by setKey failed", zap.String("setKey", setKey), zap.Error(err)) return false, err } defer rh.rwLocker.UnRLock() result, err := rh.storageClient.SIsMember(rh.ctx, setKey, member).Result() if err != nil { rh.logger.Error("get all hash field by hash key failed", zap.String("setKey", setKey), zap.Error(err)) return false, err } return result, nil }