90 lines
2.7 KiB
Go
90 lines
2.7 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 (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
|
|
}
|