Files
open-im-server/pkg/common/db/cache/redis.go
T

520 lines
18 KiB
Go
Raw Normal View History

2023-01-16 20:14:26 +08:00
package cache
2022-06-06 18:15:32 +08:00
import (
"Open_IM/pkg/common/config"
2022-06-15 14:57:21 +08:00
"Open_IM/pkg/common/constant"
2022-06-06 18:15:32 +08:00
log2 "Open_IM/pkg/common/log"
2022-07-20 21:02:25 +08:00
pbChat "Open_IM/pkg/proto/msg"
2022-06-06 18:15:32 +08:00
pbRtc "Open_IM/pkg/proto/rtc"
pbCommon "Open_IM/pkg/proto/sdk_ws"
"Open_IM/pkg/utils"
"context"
"errors"
"fmt"
2022-08-18 11:14:38 +08:00
"strconv"
"time"
2023-01-29 11:37:11 +08:00
"github.com/go-redis/redis/v8"
2022-06-13 15:58:14 +08:00
"github.com/golang/protobuf/jsonpb"
2022-06-15 12:57:40 +08:00
"github.com/golang/protobuf/proto"
2022-06-06 18:15:32 +08:00
)
2022-07-20 10:18:43 +08:00
2022-06-23 10:18:44 +08:00
const (
2023-02-09 14:40:49 +08:00
userIncrSeq = "REDIS_USER_INCR_SEQ:" // user incr seq
appleDeviceToken = "DEVICE_TOKEN"
userMinSeq = "REDIS_USER_MIN_SEQ:"
uidPidToken = "UID_PID_TOKEN_STATUS:"
getuiToken = "GETUI_TOKEN"
getuiTaskID = "GETUI_TASK_ID"
messageCache = "MESSAGE_CACHE:"
signalCache = "SIGNAL_CACHE:"
signalListCache = "SIGNAL_LIST_CACHE:"
FcmToken = "FCM_TOKEN:"
groupUserMinSeq = "GROUP_USER_MIN_SEQ:"
groupMaxSeq = "GROUP_MAX_SEQ:"
groupMinSeq = "GROUP_MIN_SEQ:"
sendMsgFailedFlag = "SEND_MSG_FAILED_FLAG:"
userBadgeUnreadCountSum = "USER_BADGE_UNREAD_COUNT_SUM:"
exTypeKeyLocker = "EX_LOCK:"
2022-06-23 10:18:44 +08:00
)
2023-02-09 14:40:49 +08:00
type Cache interface {
IncrUserSeq(uid string) (uint64, error)
GetUserMaxSeq(uid string) (uint64, error)
SetUserMaxSeq(uid string, maxSeq uint64) error
SetUserMinSeq(uid string, minSeq uint32) (err error)
GetUserMinSeq(uid string) (uint64, error)
SetGroupUserMinSeq(groupID, userID string, minSeq uint64) (err error)
GetGroupUserMinSeq(groupID, userID string) (uint64, error)
}
// native redis operate
2023-01-29 11:37:11 +08:00
type RedisClient struct {
rdb redis.UniversalClient
}
func (r *RedisClient) InitRedis() {
var rdb redis.UniversalClient
2023-01-16 20:14:26 +08:00
var err error
2023-01-17 16:36:34 +08:00
ctx := context.Background()
2023-01-16 20:14:26 +08:00
if config.Config.Redis.EnableCluster {
2023-01-29 11:37:11 +08:00
rdb = redis.NewClusterClient(&redis.ClusterOptions{
2023-01-16 20:14:26 +08:00
Addrs: config.Config.Redis.DBAddress,
Username: config.Config.Redis.DBUserName,
Password: config.Config.Redis.DBPassWord, // no password set
PoolSize: 50,
})
_, err = rdb.Ping(ctx).Result()
if err != nil {
fmt.Println("redis cluster failed address ", config.Config.Redis.DBAddress)
panic(err.Error() + " redis cluster " + config.Config.Redis.DBUserName + config.Config.Redis.DBPassWord)
}
} else {
2023-01-29 11:37:11 +08:00
rdb = redis.NewClient(&redis.Options{
2023-01-16 20:14:26 +08:00
Addr: config.Config.Redis.DBAddress[0],
Username: config.Config.Redis.DBUserName,
Password: config.Config.Redis.DBPassWord, // no password set
DB: 0, // use default DB
PoolSize: 100, // 连接池大小
})
_, err = rdb.Ping(ctx).Result()
if err != nil {
panic(err.Error() + " redis " + config.Config.Redis.DBAddress[0] + config.Config.Redis.DBUserName + config.Config.Redis.DBPassWord)
}
}
2023-01-29 11:37:11 +08:00
r.rdb = rdb
2023-01-16 20:14:26 +08:00
}
2023-01-29 11:37:11 +08:00
func (r *RedisClient) GetClient() redis.UniversalClient {
return r.rdb
2023-01-16 20:14:26 +08:00
}
2023-01-29 11:37:11 +08:00
func NewRedisClient(rdb redis.UniversalClient) *RedisClient {
2023-01-17 16:36:34 +08:00
return &RedisClient{rdb: rdb}
}
2022-06-15 16:33:30 +08:00
//Perform seq auto-increment operation of user messages
2023-01-16 20:14:26 +08:00
func (r *RedisClient) IncrUserSeq(uid string) (uint64, error) {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2022-06-15 16:33:30 +08:00
return uint64(seq), err
}
//Get the largest Seq
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetUserMaxSeq(uid string) (uint64, error) {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-06-15 16:33:30 +08:00
return uint64(utils.StringToInt(seq)), err
}
//set the largest Seq
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetUserMaxSeq(uid string, maxSeq uint64) error {
2022-06-15 16:33:30 +08:00
key := userIncrSeq + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, maxSeq, 0).Err()
2022-06-15 16:33:30 +08:00
}
//Set the user's minimum seq
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetUserMinSeq(uid string, minSeq uint32) (err error) {
2022-06-15 16:33:30 +08:00
key := userMinSeq + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-06-15 16:33:30 +08:00
}
//Get the smallest Seq
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetUserMinSeq(uid string) (uint64, error) {
2022-06-15 16:33:30 +08:00
key := userMinSeq + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-06-15 16:33:30 +08:00
return uint64(utils.StringToInt(seq)), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetGroupUserMinSeq(groupID, userID string, minSeq uint64) (err error) {
2022-07-20 10:18:43 +08:00
key := groupUserMinSeq + "g:" + groupID + "u:" + userID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-07-20 10:18:43 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetGroupUserMinSeq(groupID, userID string) (uint64, error) {
2022-07-20 10:18:43 +08:00
key := groupUserMinSeq + "g:" + groupID + "u:" + userID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-07-20 10:18:43 +08:00
return uint64(utils.StringToInt(seq)), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetGroupMaxSeq(groupID string) (uint64, error) {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-07-22 16:55:29 +08:00
return uint64(utils.StringToInt(seq)), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) IncrGroupMaxSeq(groupID string) (uint64, error) {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2022-07-22 16:55:29 +08:00
return uint64(seq), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetGroupMaxSeq(groupID string, maxSeq uint64) error {
2022-07-22 16:55:29 +08:00
key := groupMaxSeq + groupID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, maxSeq, 0).Err()
2022-07-22 16:55:29 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetGroupMinSeq(groupID string, minSeq uint32) error {
2022-08-04 17:20:33 +08:00
key := groupMinSeq + groupID
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, minSeq, 0).Err()
2022-08-04 17:20:33 +08:00
}
2022-06-15 16:33:30 +08:00
//Store userid and platform class to redis
2023-01-16 20:14:26 +08:00
func (r *RedisClient) AddTokenFlag(userID string, platformID int, token string, flag int) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
log2.NewDebug("", "add token key is ", key)
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, token, flag).Err()
2022-06-15 16:33:30 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetTokenMapByUidPid(userID, platformID string) (map[string]int, error) {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + platformID
log2.NewDebug("", "get token key is ", key)
2023-01-16 20:14:26 +08:00
m, err := r.rdb.HGetAll(context.Background(), key).Result()
2022-06-15 16:33:30 +08:00
mm := make(map[string]int)
for k, v := range m {
mm[k] = utils.StringToInt(v)
}
return mm, err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetTokenMapByUidPid(userID string, platformID int, m map[string]int) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2022-06-21 21:27:00 +08:00
mm := make(map[string]interface{})
for k, v := range m {
mm[k] = v
}
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, mm).Err()
2022-06-15 16:33:30 +08:00
}
2023-02-09 14:40:49 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DeleteTokenByUidPid(userID string, platformID int, fields []string) error {
2022-06-15 16:33:30 +08:00
key := uidPidToken + userID + ":" + constant.PlatformIDToName(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.HDel(context.Background(), key, fields...).Err()
2022-06-15 16:33:30 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetMessageListBySeq(userID string, seqList []uint32, operationID string) (seqMsg []*pbCommon.MsgData, failedSeqList []uint32, errResult error) {
2022-06-06 18:15:32 +08:00
for _, v := range seqList {
//MESSAGE_CACHE:169.254.225.224_reliability1653387820_0_1
key := messageCache + userID + "_" + strconv.Itoa(int(v))
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), key).Result()
2022-06-15 23:30:33 +08:00
if err != nil {
errResult = err
failedSeqList = append(failedSeqList, v)
2022-08-12 21:48:13 +08:00
log2.Debug(operationID, "redis get message error: ", err.Error(), v)
2022-06-15 23:30:33 +08:00
} else {
2022-06-13 15:58:14 +08:00
msg := pbCommon.MsgData{}
2022-06-15 23:30:33 +08:00
err = jsonpb.UnmarshalString(result, &msg)
2022-06-06 18:15:32 +08:00
if err != nil {
errResult = err
2022-06-15 23:30:33 +08:00
failedSeqList = append(failedSeqList, v)
2022-08-12 21:48:13 +08:00
log2.NewWarn(operationID, "Unmarshal err ", result, err.Error())
2022-06-06 18:15:32 +08:00
} else {
log2.NewDebug(operationID, "redis get msg is ", msg.String())
2022-06-13 15:58:14 +08:00
seqMsg = append(seqMsg, &msg)
2022-06-06 18:15:32 +08:00
}
2022-06-15 23:30:33 +08:00
2022-06-06 18:15:32 +08:00
}
}
return seqMsg, failedSeqList, errResult
}
2022-08-05 15:16:43 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetMessageToCache(msgList []*pbChat.MsgDataToMQ, uid string, operationID string) (error, int) {
2022-06-06 18:15:32 +08:00
ctx := context.Background()
2023-01-16 20:14:26 +08:00
pipe := r.rdb.Pipeline()
2022-06-06 18:15:32 +08:00
var failedList []pbChat.MsgDataToMQ
for _, msg := range msgList {
key := messageCache + uid + "_" + strconv.Itoa(int(msg.MsgData.Seq))
2022-06-13 15:58:14 +08:00
s, err := utils.Pb2String(msg.MsgData)
2022-06-06 18:15:32 +08:00
if err != nil {
2022-06-13 15:58:14 +08:00
log2.NewWarn(operationID, utils.GetSelfFuncName(), "Pb2String failed", msg.MsgData.String(), uid, err.Error())
2022-06-06 18:15:32 +08:00
continue
}
2022-06-13 15:58:14 +08:00
log2.NewDebug(operationID, "convert string is ", s)
2022-06-15 19:17:49 +08:00
err = pipe.Set(ctx, key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err()
2023-01-16 20:14:26 +08:00
//err = r.rdb.HMSet(context.Background(), "12", map[string]interface{}{"1": 2, "343": false}).Err()
2022-06-06 18:15:32 +08:00
if err != nil {
log2.NewWarn(operationID, utils.GetSelfFuncName(), "redis failed", "args:", key, *msg, uid, s, err.Error())
failedList = append(failedList, *msg)
}
}
if len(failedList) != 0 {
2022-09-14 19:36:59 +08:00
return errors.New(fmt.Sprintf("set msg to cache failed, failed lists: %q,%s", failedList, operationID)), len(failedList)
2022-06-06 18:15:32 +08:00
}
2022-06-15 19:17:49 +08:00
_, err := pipe.Exec(ctx)
2022-09-14 19:36:59 +08:00
return err, 0
2022-06-06 18:15:32 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DeleteMessageFromCache(msgList []*pbChat.MsgDataToMQ, uid string, operationID string) error {
2022-07-27 12:15:32 +08:00
ctx := context.Background()
for _, msg := range msgList {
key := messageCache + uid + "_" + strconv.Itoa(int(msg.MsgData.Seq))
2023-01-16 20:14:26 +08:00
err := r.rdb.Del(ctx, key).Err()
2022-08-18 11:14:38 +08:00
if err != nil {
log2.NewWarn(operationID, utils.GetSelfFuncName(), "redis failed", "args:", key, uid, err.Error(), msgList)
}
2022-07-27 12:15:32 +08:00
}
2022-08-18 11:14:38 +08:00
return nil
2022-07-27 12:15:32 +08:00
}
2022-06-06 18:15:32 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) CleanUpOneUserAllMsgFromRedis(userID string, operationID string) error {
2022-06-06 18:15:32 +08:00
ctx := context.Background()
key := messageCache + userID + "_" + "*"
2023-01-16 20:14:26 +08:00
vals, err := r.rdb.Keys(ctx, key).Result()
2022-06-06 18:15:32 +08:00
log2.Debug(operationID, "vals: ", vals)
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2022-06-06 18:15:32 +08:00
return nil
}
if err != nil {
return utils.Wrap(err, "")
}
2022-08-11 20:25:33 +08:00
for _, v := range vals {
2023-01-16 20:14:26 +08:00
err = r.rdb.Del(ctx, v).Err()
2022-06-06 18:15:32 +08:00
}
return nil
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) HandleSignalInfo(operationID string, msg *pbCommon.MsgData, pushToUserID string) (isSend bool, err error) {
2022-06-06 18:52:17 +08:00
req := &pbRtc.SignalReq{}
if err := proto.Unmarshal(msg.Content, req); err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-06 18:15:32 +08:00
}
2022-06-06 18:52:17 +08:00
//log.NewDebug(pushMsg.OperationID, utils.GetSelfFuncName(), "SignalReq: ", req.String())
2022-06-06 21:04:11 +08:00
var inviteeUserIDList []string
2022-06-10 17:31:30 +08:00
var isInviteSignal bool
switch signalInfo := req.Payload.(type) {
2022-06-06 21:04:11 +08:00
case *pbRtc.SignalReq_Invite:
2022-06-10 17:31:30 +08:00
inviteeUserIDList = signalInfo.Invite.Invitation.InviteeUserIDList
isInviteSignal = true
2022-06-06 21:04:11 +08:00
case *pbRtc.SignalReq_InviteInGroup:
2022-06-10 17:31:30 +08:00
inviteeUserIDList = signalInfo.InviteInGroup.Invitation.InviteeUserIDList
isInviteSignal = true
2022-09-02 17:22:27 +08:00
if !utils.IsContain(pushToUserID, inviteeUserIDList) {
return false, nil
}
2022-06-13 11:53:12 +08:00
case *pbRtc.SignalReq_HungUp, *pbRtc.SignalReq_Cancel, *pbRtc.SignalReq_Reject, *pbRtc.SignalReq_Accept:
2023-02-02 19:40:54 +08:00
return false, nil
2022-06-06 21:04:11 +08:00
default:
2022-09-02 17:22:27 +08:00
return false, nil
2022-06-06 21:04:11 +08:00
}
2022-06-10 17:31:30 +08:00
if isInviteSignal {
2022-09-02 17:22:27 +08:00
log2.NewDebug(operationID, utils.GetSelfFuncName(), "invite userID list:", inviteeUserIDList)
2022-06-10 17:31:30 +08:00
for _, userID := range inviteeUserIDList {
2022-06-14 15:56:06 +08:00
log2.NewInfo(operationID, utils.GetSelfFuncName(), "invite userID:", userID)
2022-06-10 17:31:30 +08:00
timeout, err := strconv.Atoi(config.Config.Rtc.SignalTimeout)
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
err = r.rdb.LPush(context.Background(), keyList, msg.ClientMsgID).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-01-16 20:14:26 +08:00
err = r.rdb.Expire(context.Background(), keyList, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2023-02-09 14:40:49 +08:00
key := signalCache + msg.ClientMsgID
2023-01-16 20:14:26 +08:00
err = r.rdb.Set(context.Background(), key, msg.Content, time.Duration(timeout)*time.Second).Err()
2022-06-10 17:31:30 +08:00
if err != nil {
2022-09-02 17:22:27 +08:00
return false, err
2022-06-10 17:31:30 +08:00
}
2022-06-06 18:52:17 +08:00
}
2022-06-06 18:15:32 +08:00
}
2022-09-02 17:22:27 +08:00
return true, nil
2022-06-06 18:15:32 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetSignalInfoFromCacheByClientMsgID(clientMsgID string) (invitationInfo *pbRtc.SignalInviteReq, err error) {
2023-02-09 14:40:49 +08:00
key := signalCache + clientMsgID
2022-06-06 19:36:25 +08:00
invitationInfo = &pbRtc.SignalInviteReq{}
2023-01-16 20:14:26 +08:00
bytes, err := r.rdb.Get(context.Background(), key).Bytes()
2022-06-06 18:15:32 +08:00
if err != nil {
return nil, err
}
req := &pbRtc.SignalReq{}
if err = proto.Unmarshal(bytes, req); err != nil {
return nil, err
}
2022-06-06 19:36:25 +08:00
switch req2 := req.Payload.(type) {
case *pbRtc.SignalReq_Invite:
invitationInfo.Invitation = req2.Invite.Invitation
2022-06-13 20:11:43 +08:00
invitationInfo.OpUserID = req2.Invite.OpUserID
2022-06-06 19:36:25 +08:00
case *pbRtc.SignalReq_InviteInGroup:
invitationInfo.Invitation = req2.InviteInGroup.Invitation
2022-06-13 20:11:43 +08:00
invitationInfo.OpUserID = req2.InviteInGroup.OpUserID
2022-06-06 19:36:25 +08:00
}
2022-06-06 18:15:32 +08:00
return invitationInfo, err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetAvailableSignalInvitationInfo(userID string) (invitationInfo *pbRtc.SignalInviteReq, err error) {
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
result := r.rdb.LPop(context.Background(), keyList)
2022-06-06 18:15:32 +08:00
if err = result.Err(); err != nil {
2022-06-06 19:20:12 +08:00
return nil, utils.Wrap(err, "GetAvailableSignalInvitationInfo failed")
2022-06-06 18:15:32 +08:00
}
2022-06-06 19:20:12 +08:00
key, err := result.Result()
if err != nil {
return nil, utils.Wrap(err, "GetAvailableSignalInvitationInfo failed")
}
log2.NewDebug("", utils.GetSelfFuncName(), result, result.String())
2023-01-16 20:14:26 +08:00
invitationInfo, err = r.GetSignalInfoFromCacheByClientMsgID(key)
2022-06-06 23:27:16 +08:00
if err != nil {
return nil, utils.Wrap(err, "GetSignalInfoFromCacheByClientMsgID")
}
2023-01-16 20:14:26 +08:00
err = r.DelUserSignalList(userID)
2022-06-06 23:27:16 +08:00
if err != nil {
return nil, utils.Wrap(err, "GetSignalInfoFromCacheByClientMsgID")
}
return invitationInfo, nil
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DelUserSignalList(userID string) error {
2023-02-09 14:40:49 +08:00
keyList := signalListCache + userID
2023-01-16 20:14:26 +08:00
err := r.rdb.Del(context.Background(), keyList).Err()
2022-06-06 23:27:16 +08:00
return err
2022-06-06 18:15:32 +08:00
}
2022-06-15 14:57:21 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DelMsgFromCache(uid string, seqList []uint32, operationID string) {
2022-06-15 14:57:21 +08:00
for _, seq := range seqList {
key := messageCache + uid + "_" + strconv.Itoa(int(seq))
2023-01-16 20:14:26 +08:00
result, err := r.rdb.Get(context.Background(), key).Result()
2022-08-09 19:44:27 +08:00
if err != nil {
2023-01-29 11:37:11 +08:00
if err == redis.Nil {
2022-08-09 19:44:27 +08:00
log2.NewDebug(operationID, utils.GetSelfFuncName(), err.Error(), "redis nil")
} else {
log2.NewError(operationID, utils.GetSelfFuncName(), err.Error(), key)
}
continue
}
2022-06-15 14:57:21 +08:00
var msg pbCommon.MsgData
if err := utils.String2Pb(result, &msg); err != nil {
2022-08-09 18:48:11 +08:00
log2.Error(operationID, utils.GetSelfFuncName(), "String2Pb failed", msg, result, key, err.Error())
2022-06-15 14:57:21 +08:00
continue
}
msg.Status = constant.MsgDeleted
s, err := utils.Pb2String(&msg)
if err != nil {
log2.Error(operationID, utils.GetSelfFuncName(), "Pb2String failed", msg, err.Error())
continue
}
2023-01-16 20:14:26 +08:00
if err := r.rdb.Set(context.Background(), key, s, time.Duration(config.Config.MsgCacheTimeout)*time.Second).Err(); err != nil {
2022-06-15 14:57:21 +08:00
log2.Error(operationID, utils.GetSelfFuncName(), "Set failed", err.Error())
}
}
}
2022-06-15 16:16:35 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetGetuiToken(token string, expireTime int64) error {
return r.rdb.Set(context.Background(), getuiToken, token, time.Duration(expireTime)*time.Second).Err()
2022-06-15 16:16:35 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetGetuiToken() (string, error) {
result, err := r.rdb.Get(context.Background(), getuiToken).Result()
2022-08-08 17:14:59 +08:00
return result, err
2022-06-15 16:16:35 +08:00
}
2022-07-26 15:16:46 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetGetuiTaskID(taskID string, expireTime int64) error {
return r.rdb.Set(context.Background(), getuiTaskID, taskID, time.Duration(expireTime)*time.Second).Err()
2022-12-21 16:46:16 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetGetuiTaskID() (string, error) {
result, err := r.rdb.Get(context.Background(), getuiTaskID).Result()
2022-12-21 16:46:16 +08:00
return result, err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetSendMsgStatus(status int32, operationID string) error {
return r.rdb.Set(context.Background(), sendMsgFailedFlag+operationID, status, time.Hour*24).Err()
2022-07-26 15:16:46 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetSendMsgStatus(operationID string) (int, error) {
result, err := r.rdb.Get(context.Background(), sendMsgFailedFlag+operationID).Result()
2022-09-06 15:51:18 +08:00
if err != nil {
return 0, err
}
status, err := strconv.Atoi(result)
return status, err
2022-07-26 15:16:46 +08:00
}
2022-07-26 15:20:48 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetFcmToken(account string, platformID int, fcmToken string, expireTime int64) (err error) {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, fcmToken, time.Duration(expireTime)*time.Second).Err()
2022-07-25 17:57:58 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetFcmToken(account string, platformID int) (string, error) {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Get(context.Background(), key).Result()
2022-07-25 17:57:58 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DelFcmToken(account string, platformID int) error {
2022-10-27 17:15:06 +08:00
key := FcmToken + account + ":" + strconv.Itoa(platformID)
2023-01-16 20:14:26 +08:00
return r.rdb.Del(context.Background(), key).Err()
2022-10-27 17:15:06 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) IncrUserBadgeUnreadCountSum(uid string) (int, error) {
2022-09-01 21:05:16 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Incr(context.Background(), key).Result()
2022-09-01 21:05:16 +08:00
return int(seq), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetUserBadgeUnreadCountSum(uid string, value int) error {
2022-09-01 21:05:16 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
return r.rdb.Set(context.Background(), key, value, 0).Err()
2022-09-01 21:05:16 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetUserBadgeUnreadCountSum(uid string) (int, error) {
2022-09-07 16:41:18 +08:00
key := userBadgeUnreadCountSum + uid
2023-01-16 20:14:26 +08:00
seq, err := r.rdb.Get(context.Background(), key).Result()
2022-09-07 16:41:18 +08:00
return utils.StringToInt(seq), err
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) JudgeMessageReactionEXISTS(clientMsgID string, sessionType int32) (bool, error) {
2022-12-09 20:53:13 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
n, err := r.rdb.Exists(context.Background(), key).Result()
2022-12-09 20:53:13 +08:00
if n > 0 {
return true, err
} else {
return false, err
}
}
2022-12-12 19:15:31 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetOneMessageAllReactionList(clientMsgID string, sessionType int32) (map[string]string, error) {
2022-12-12 19:15:31 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HGetAll(context.Background(), key).Result()
2022-12-12 19:15:31 +08:00
2022-12-12 20:41:40 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) DeleteOneMessageKey(clientMsgID string, sessionType int32, subKey string) error {
2022-12-12 20:41:40 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HDel(context.Background(), key, subKey).Err()
2022-12-12 20:41:40 +08:00
2022-12-12 19:15:31 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetMessageReactionExpire(clientMsgID string, sessionType int32, expiration time.Duration) (bool, error) {
2022-12-12 12:12:53 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.Expire(context.Background(), key, expiration).Result()
2022-12-12 12:12:53 +08:00
}
2023-02-09 14:40:49 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) GetMessageTypeKeyValue(clientMsgID string, sessionType int32, typeKey string) (string, error) {
2022-12-09 20:53:13 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
result, err := r.rdb.HGet(context.Background(), key, typeKey).Result()
2022-12-09 20:53:13 +08:00
return result, err
}
2023-02-09 14:40:49 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) SetMessageTypeKeyValue(clientMsgID string, sessionType int32, typeKey, value string) error {
2022-12-09 20:53:13 +08:00
key := getMessageReactionExPrefix(clientMsgID, sessionType)
2023-01-16 20:14:26 +08:00
return r.rdb.HSet(context.Background(), key, typeKey, value).Err()
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
2023-01-16 20:14:26 +08:00
func (r *RedisClient) LockMessageTypeKey(clientMsgID string, TypeKey string) error {
2022-12-09 20:53:13 +08:00
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-01-16 20:14:26 +08:00
return r.rdb.SetNX(context.Background(), key, 1, time.Minute).Err()
2022-12-09 20:53:13 +08:00
}
2023-01-16 20:14:26 +08:00
func (r *RedisClient) UnLockMessageTypeKey(clientMsgID string, TypeKey string) error {
2022-12-09 20:53:13 +08:00
key := exTypeKeyLocker + clientMsgID + "_" + TypeKey
2023-01-16 20:14:26 +08:00
return r.rdb.Del(context.Background(), key).Err()
2022-12-09 20:53:13 +08:00
}
2023-02-09 14:40:49 +08:00
func (r *RedisClient) getMessageReactionExPrefix(clientMsgID string, sessionType int32) string {
2022-12-09 20:53:13 +08:00
switch sessionType {
case constant.SingleChatType:
return "EX_SINGLE_" + clientMsgID
case constant.GroupChatType:
return "EX_GROUP_" + clientMsgID
case constant.SuperGroupChatType:
return "EX_SUPER_GROUP_" + clientMsgID
case constant.NotificationChatType:
return "EX_NOTIFICATION" + clientMsgID
}
return ""
}