u
This commit is contained in:
1 parent
8663cb2e3d
commit
83cbf18572
34 files changed
+1938
-1350
No files matched your search
@@ -2,26 +2,139 @@ package redisx
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
// Set 设置 key
|
||||
func Set(ctx context.Context, key string, value any, ttl time.Duration) error {
|
||||
return Client().Set(ctx, key, value, ttl).Err()
|
||||
// ---------------- 基础方法 ----------------
|
||||
|
||||
// Set 设置任意 key
|
||||
func Set(key string, value interface{}, expire time.Duration) error {
|
||||
return Client().Set(context.Background(), key, value, expire).Err()
|
||||
}
|
||||
|
||||
// Get 获取 string
|
||||
func Get(ctx context.Context, key string) (string, error) {
|
||||
return Client().Get(ctx, key).Result()
|
||||
// Get 获取任意 key 的值,返回 string
|
||||
func Get(key string) (string, error) {
|
||||
val, err := Client().Get(context.Background(), key).Result()
|
||||
if errors.Is(err, redis.Nil) {
|
||||
return "", nil
|
||||
}
|
||||
return val, err
|
||||
}
|
||||
|
||||
// Del 删除
|
||||
func Del(ctx context.Context, keys ...string) error {
|
||||
return Client().Del(ctx, keys...).Err()
|
||||
// Delete 删除任意 key
|
||||
func Delete(key string) error {
|
||||
return Client().Del(context.Background(), key).Err()
|
||||
}
|
||||
|
||||
// Exists 是否存在
|
||||
func Exists(ctx context.Context, key string) (bool, error) {
|
||||
n, err := Client().Exists(ctx, key).Result()
|
||||
return n > 0, err
|
||||
// Exists 判断 key 是否存在
|
||||
func Exists(key string) (bool, error) {
|
||||
cnt, err := Client().Exists(context.Background(), key).Result()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
return cnt > 0, nil
|
||||
}
|
||||
|
||||
// SetUserSpaces 初始化用户空间列表(spaceID -> role)
|
||||
func SetUserSpaces(ctx context.Context, userID int64, spaces map[int64]int32) error {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
|
||||
pipe := Client().TxPipeline()
|
||||
|
||||
// 1. 先清空旧数据
|
||||
pipe.Del(ctx, key)
|
||||
|
||||
// 2. 再写入新数据(如果有)
|
||||
if len(spaces) > 0 {
|
||||
data := make(map[string]interface{}, len(spaces))
|
||||
for spaceID, role := range spaces {
|
||||
data[strconv.FormatInt(spaceID, 10)] = role
|
||||
}
|
||||
pipe.HSet(ctx, key, data)
|
||||
}
|
||||
|
||||
// 3. 执行
|
||||
_, err := pipe.Exec(ctx)
|
||||
return err
|
||||
}
|
||||
|
||||
// AddOrUpdateUserSpace 添加或更新单个空间的角色(增量更新)
|
||||
func AddOrUpdateUserSpace(ctx context.Context, userID, spaceID int64, role int32) error {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
return Client().HSet(ctx, key, strconv.FormatInt(spaceID, 10), role).Err()
|
||||
}
|
||||
|
||||
// GetUserSpaces 获取用户所有空间列表和角色
|
||||
func GetUserSpaces(ctx context.Context, userID int64) (map[int64]int, error) {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
result, err := Client().HGetAll(ctx, key).Result()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
spaces := make(map[int64]int, len(result))
|
||||
for k, v := range result {
|
||||
spaceID, err1 := strconv.ParseInt(k, 10, 64)
|
||||
role, err2 := strconv.Atoi(v)
|
||||
if err1 != nil || err2 != nil {
|
||||
continue
|
||||
}
|
||||
spaces[spaceID] = role
|
||||
}
|
||||
|
||||
return spaces, nil
|
||||
}
|
||||
|
||||
// GetUserSpaceRole 获取用户在指定空间的角色
|
||||
func GetUserSpaceRole(ctx context.Context, userID int64, spaceID int64) (role int, exists bool, err error) {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
val, err := Client().HGet(ctx, key, strconv.FormatInt(spaceID, 10)).Result()
|
||||
if err != nil {
|
||||
if errors.Is(err, redis.Nil) {
|
||||
return 0, false, nil // 用户不在空间
|
||||
}
|
||||
return 0, false, err
|
||||
}
|
||||
|
||||
role, err = strconv.Atoi(val)
|
||||
if err != nil {
|
||||
return 0, false, err
|
||||
}
|
||||
|
||||
return role, true, nil
|
||||
}
|
||||
|
||||
// RemoveUserSpace 从用户缓存中删除一个空间(用户退出或被踢)
|
||||
func RemoveUserSpace(ctx context.Context, userID int64, spaceID int64) error {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
return Client().HDel(ctx, key, strconv.FormatInt(spaceID, 10)).Err()
|
||||
}
|
||||
|
||||
// ClearUserSpaces 删除用户的所有空间列表
|
||||
func ClearUserSpaces(ctx context.Context, userID int64) error {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
return Client().Del(ctx, key).Err()
|
||||
}
|
||||
|
||||
func InSpace(ctx context.Context, userID, spaceID int64) (bool, error) {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
return Client().HExists(ctx, key, strconv.FormatInt(spaceID, 10)).Result()
|
||||
}
|
||||
|
||||
// HasUserSpaces 判断用户是否在 Redis 中有空间缓存
|
||||
func HasUserSpaces(ctx context.Context, userID int64) (bool, error) {
|
||||
key := fmt.Sprintf("user:%d:spaces", userID)
|
||||
|
||||
// HLen 返回 hash 的字段数量
|
||||
cnt, err := Client().HLen(ctx, key).Result()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return cnt > 0, nil
|
||||
}
|
||||
Reference in new issue
Block a user