userRoomVisit.go 4.04 KB
Newer Older
hujiebin's avatar
hujiebin committed
1 2 3 4 5 6
package room_c

import (
	"context"
	"fmt"
	"git.hilo.cn/hilo-common/mylogrus"
hujiebin's avatar
hujiebin committed
7
	"git.hilo.cn/hilo-common/resource/config"
hujiebin's avatar
hujiebin committed
8 9
	"git.hilo.cn/hilo-common/resource/redisCli"
	redis2 "github.com/go-redis/redis/v8"
10
	"github.com/spf13/cast"
hujiebin's avatar
hujiebin committed
11
	"hilo-group/_const/redis_key"
12
	"hilo-group/_const/redis_key/group_k"
hujiebin's avatar
hujiebin committed
13 14 15
	"time"
)

hujiebin's avatar
hujiebin committed
16 17
// 处理访问房间的相关缓存
func ProcessRoomVisit(groupId string, userId uint64) error {
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
	//key := redis_key.GetPrefixGroupInUserDuration(groupId)
	//now := time.Now()
	//ret, err := redisCli.GetRedis().ZAdd(context.Background(), key, &redis2.Z{
	//	Score:  float64(now.Unix()),
	//	Member: userId,
	//}).Result()
	//if err != nil {
	//	return err
	//}
	//mylogrus.MyLog.Infof("ProcessRoomVisit, ZADD %s, return %d", key, ret)
	//
	//// 每群定时清一次数据可以了
	//if now.Second()%redis_key.GroupInDurationClearPeriod == 0 {
	//	rc, err := clearRoomVisit(groupId, now.AddDate(0, 0, -redis_key.GroupInDurationTTL))
	//	if err == nil {
	//		mylogrus.MyLog.Infof("ProcessRoomVisit, clearRoomVisit %s, return %d", key, rc)
	//	} else {
	//		mylogrus.MyLog.Warnf("ProcessRoomVisit, clearRoomVisit %s, failed %s", key, err.Error())
	//	}
	//}
hujiebin's avatar
hujiebin committed
38 39 40

	// 马上更新roomVisitCount
	if _, err := GetSetRoomVisitCount(groupId); err != nil {
41
		mylogrus.MyLog.Errorf("ProcessRoomVisit, failed for groupId %s, err: %s", groupId, err.Error())
hujiebin's avatar
hujiebin committed
42 43 44 45 46
	}

	return nil
}

hujiebin's avatar
hujiebin committed
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
func ProcessUserRoomVisit(userId uint64, groupId string) error {
	key := redis_key.GetUserEnterRoomKey(userId)
	now := time.Now()
	ret, err := redisCli.GetRedis().ZAdd(context.Background(), key, &redis2.Z{
		Score:  float64(now.Unix()),
		Member: groupId,
	}).Result()
	if err != nil {
		return err
	}
	mylogrus.MyLog.Infof("ProcessUserRoomVisit, ZADD %s, return %d", key, ret)

	return nil
}

// 查询用户访问过的房间及其时间
hujiebin's avatar
hujiebin committed
63
// todo 去掉查询,redis性能
hujiebin's avatar
hujiebin committed
64
func GetUserRoomVisit(userId uint64) (map[string]int64, error) {
hujiebin's avatar
hujiebin committed
65 66
	result := make(map[string]int64, 0)
	return result, nil
hujiebin's avatar
hujiebin committed
67 68 69 70 71
	key := redis_key.GetUserEnterRoomKey(userId)
	ret, err := redisCli.GetRedis().ZRangeWithScores(context.Background(), key, 0, -1).Result()
	if err != nil {
		return nil, err
	}
hujiebin's avatar
hujiebin committed
72
	//mylogrus.MyLog.Infof("GetUserRoomVisit, ZRangeWithScores %s, return %v", key, ret)
hujiebin's avatar
hujiebin committed
73 74 75 76 77 78 79 80

	for _, i := range ret {
		result[i.Member.(string)] = int64(i.Score)
	}
	return result, nil
}

// 批量获取房间访问人数
81
// 带上lru
hujiebin's avatar
hujiebin committed
82 83 84 85 86
func MGetRoomVisitCount(groupIds []string) (map[string]string, error) {
	visit := make(map[string]string)
	if len(groupIds) <= 0 {
		return visit, nil
	}
87 88
	// 用redisCluster中的zset代替,只是取出大于100的
	zKey := redis_key.GetPrefixRoomVisitCountZset()
hujiebin's avatar
hujiebin committed
89 90 91 92
	cnt := 100
	if !config.AppIsRelease() {
		cnt = 0
	}
93
	zRes, err := redisCli.GetClusterRedis().ZRevRangeByScoreWithScores(context.Background(), zKey, &redis2.ZRangeBy{
hujiebin's avatar
hujiebin committed
94
		Min: fmt.Sprintf("%d", cnt), // 100人数以上的。
95 96 97 98 99 100 101 102 103 104
		Max: "+inf",
	}).Result()
	if err != nil {
		mylogrus.MyLog.Errorf("MGetRoomVisitCount zset fail:%v", err)
		return visit, err
	}
	for _, v := range zRes {
		visit[cast.ToString(v.Member)] = cast.ToString(v.Score)
	}
	return visit, nil
hujiebin's avatar
hujiebin committed
105 106 107
}

func GetSetRoomVisitCount(groupId string) (int64, error) {
108 109
	//key := redis_key.GetPrefixGroupInUserDuration(groupId)
	key := group_k.GetUserEnterRoomGroupKey(groupId)
hujiebin's avatar
hujiebin committed
110 111 112
	vc, err := redisCli.GetRedis().ZCard(context.Background(), key).Result()
	// 查到合法值后,更新二级缓存
	if err == nil && vc >= 0 {
hujiebin's avatar
hujiebin committed
113 114
		if err := saveRoomVisitCount(groupId, vc); err != nil {
			mylogrus.MyLog.Errorf("saveRoomVisitCount %s, err: %v", groupId, err)
115
		}
hujiebin's avatar
hujiebin committed
116 117 118 119
	}
	return vc, err
}

hujiebin's avatar
hujiebin committed
120 121
func saveRoomVisitCount(groupId string, count int64) error {
	//key := redis_key.GetPrefixRoomVisitCount()
122 123 124 125 126 127 128
	zKey := redis_key.GetPrefixRoomVisitCountZset()
	// zset同步存一份到redis集群
	if err := redisCli.GetClusterRedis().ZAdd(context.Background(), zKey, &redis2.Z{
		Score:  float64(count),
		Member: groupId,
	}).Err(); err != nil {
		mylogrus.MyLog.Errorf("GetPrefixRoomVisitCountZset fail %s", err.Error())
hujiebin's avatar
hujiebin committed
129
		return err
130
	}
hujiebin's avatar
hujiebin committed
131 132
	return nil
	//return redisCli.GetRedis().HSet(context.Background(), key, groupId, strconv.FormatInt(count, 10)).Result()
hujiebin's avatar
hujiebin committed
133
}