2025-03-21 16:21:33 +08:00
|
|
|
package diagram
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
locker "modelRT/distributedlock"
|
2025-03-24 16:37:43 +08:00
|
|
|
"modelRT/logger"
|
2025-03-21 16:21:33 +08:00
|
|
|
|
|
|
|
|
"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
|
2025-12-08 17:01:24 +08:00
|
|
|
key string
|
2025-03-21 16:21:33 +08:00
|
|
|
rwLocker *locker.RedissionRWLocker
|
|
|
|
|
storageClient *redis.Client
|
|
|
|
|
logger *zap.Logger
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-24 16:37:43 +08:00
|
|
|
// NewRedisSet define func of new redis set instance
|
2025-09-24 16:43:11 +08:00
|
|
|
func NewRedisSet(ctx context.Context, setKey string, lockLeaseTime uint64, needRefresh bool) *RedisSet {
|
|
|
|
|
token := ctx.Value("client_token").(string)
|
2025-03-24 16:37:43 +08:00
|
|
|
return &RedisSet{
|
|
|
|
|
ctx: ctx,
|
2025-12-08 17:01:24 +08:00
|
|
|
key: setKey,
|
2025-09-24 16:43:11 +08:00
|
|
|
rwLocker: locker.InitRWLocker(setKey, token, lockLeaseTime, needRefresh),
|
2025-03-24 16:37:43 +08:00
|
|
|
storageClient: GetRedisClientInstance(),
|
|
|
|
|
logger: logger.GetLoggerInstance(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-21 16:21:33 +08:00
|
|
|
// SADD define func of add redis set by members
|
2025-12-08 17:01:24 +08:00
|
|
|
func (rs *RedisSet) SADD(members ...any) error {
|
2025-03-24 16:37:43 +08:00
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "lock wLock by setKey failed", "set_key", rs.key, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return err
|
|
|
|
|
}
|
2025-03-24 16:37:43 +08:00
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
|
2025-12-08 17:01:24 +08:00
|
|
|
err = rs.storageClient.SAdd(rs.ctx, rs.key, members).Err()
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "add set by memebers failed", "set_key", rs.key, "members", members, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SREM define func of remove the specified members from redis set by key
|
2025-12-08 17:01:24 +08:00
|
|
|
func (rs *RedisSet) SREM(members ...any) error {
|
2025-03-24 16:37:43 +08:00
|
|
|
err := rs.rwLocker.WLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "lock wLock by setKey failed", "set_key", rs.key, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return err
|
|
|
|
|
}
|
2025-03-24 16:37:43 +08:00
|
|
|
defer rs.rwLocker.UnWLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
|
2025-12-08 17:01:24 +08:00
|
|
|
count, err := rs.storageClient.SRem(rs.ctx, rs.key, members).Result()
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil || count != int64(len(members)) {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "rem members from set failed", "set_key", rs.key, "members", members, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
|
|
|
|
|
return fmt.Errorf("rem members from set failed:%w", err)
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SMembers define func of get all memebers from redis set by key
|
2025-12-08 17:01:24 +08:00
|
|
|
func (rs *RedisSet) SMembers() ([]string, error) {
|
2025-03-24 16:37:43 +08:00
|
|
|
err := rs.rwLocker.RLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "lock rLock by setKey failed", "set_key", rs.key, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return nil, err
|
|
|
|
|
}
|
2025-03-24 16:37:43 +08:00
|
|
|
defer rs.rwLocker.UnRLock(rs.ctx)
|
2025-03-21 16:21:33 +08:00
|
|
|
|
2025-12-08 17:01:24 +08:00
|
|
|
result, err := rs.storageClient.SMembers(rs.ctx, rs.key).Result()
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "get all set field by hash key failed", "set_key", rs.key, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return result, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SIsMember define func of determine whether an member is in set by key
|
2025-12-08 17:01:24 +08:00
|
|
|
func (rs *RedisSet) SIsMember(member any) (bool, error) {
|
|
|
|
|
result, err := rs.storageClient.SIsMember(rs.ctx, rs.key, member).Result()
|
2025-03-21 16:21:33 +08:00
|
|
|
if err != nil {
|
2025-12-08 17:01:24 +08:00
|
|
|
logger.Error(rs.ctx, "get all set field by hash key failed", "set_key", rs.key, "error", err)
|
2025-03-21 16:21:33 +08:00
|
|
|
return false, err
|
|
|
|
|
}
|
|
|
|
|
return result, nil
|
|
|
|
|
}
|