modelRT/diagram/redis_set.go

83 lines
2.5 KiB
Go

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 (rs *RedisSet) SREM(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()
count, err := rs.storageClient.SRem(rs.ctx, setKey, members).Result()
if err != nil || count != int64(len(members)) {
rs.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 (rs *RedisSet) SMembers(setKey string) ([]string, error) {
err := rs.rwLocker.RLock()
if err != nil {
rs.logger.Error("lock rLock by setKey failed", zap.String("setKey", setKey), zap.Error(err))
return nil, err
}
defer rs.rwLocker.UnRLock()
result, err := rs.storageClient.SMembers(rs.ctx, setKey).Result()
if err != nil {
rs.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) {
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
}