mirror of https://github.com/rocboss/paopao-ce
parent
a14921448e
commit
bf4026c5af
@ -0,0 +1,30 @@
|
||||
// Copyright 2023 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package conf
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/alimy/tryst/cache"
|
||||
)
|
||||
|
||||
const (
|
||||
_defaultKeyPoolSize = 128
|
||||
)
|
||||
|
||||
// 以下包含一些在cache中会用到的池化后的key
|
||||
var (
|
||||
KeyUnreadMsg cache.KeyPool[int64]
|
||||
)
|
||||
|
||||
func initCacheKeyPool() {
|
||||
poolSize := _defaultKeyPoolSize
|
||||
if poolSize < CacheSetting.KeyPoolSize {
|
||||
poolSize = CacheSetting.KeyPoolSize
|
||||
}
|
||||
KeyUnreadMsg = cache.MustKeyPool[int64](poolSize, func(key int64) string {
|
||||
return fmt.Sprintf("paopao:unreadmsg:%d", key)
|
||||
})
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
// Copyright 2023 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
"github.com/redis/rueidis"
|
||||
"github.com/rocboss/paopao-ce/internal/conf"
|
||||
"github.com/rocboss/paopao-ce/internal/core"
|
||||
"github.com/rocboss/paopao-ce/pkg/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
_webCache core.WebCache = (*redisWebCache)(nil)
|
||||
)
|
||||
|
||||
type redisWebCache struct {
|
||||
cscExpire time.Duration
|
||||
unreadMsgExpire int64
|
||||
c rueidis.Client
|
||||
}
|
||||
|
||||
func (s *redisWebCache) Name() string {
|
||||
return "RedisWebCache"
|
||||
}
|
||||
|
||||
func (s *redisWebCache) Version() *semver.Version {
|
||||
return semver.MustParse("v0.1.0")
|
||||
}
|
||||
|
||||
func (s *redisWebCache) GetUnreadMsgCountResp(uid int64) ([]byte, error) {
|
||||
key := conf.KeyUnreadMsg.Get(uid)
|
||||
res, err := rueidis.MGetCache(s.c, context.Background(), s.cscExpire, []string{key})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
message := res[key]
|
||||
return message.AsBytes()
|
||||
}
|
||||
|
||||
func (s *redisWebCache) PutUnreadMsgCountResp(uid int64, data []byte) error {
|
||||
return s.c.Do(context.Background(), s.c.B().Set().
|
||||
Key(conf.KeyUnreadMsg.Get(uid)).
|
||||
Value(utils.String(data)).
|
||||
ExSeconds(s.unreadMsgExpire).
|
||||
Build()).
|
||||
Error()
|
||||
}
|
||||
|
||||
func (s *redisWebCache) DelUnreadMsgCountResp(uid int64) error {
|
||||
return s.c.Do(context.Background(), s.c.B().Del().Key(conf.KeyUnreadMsg.Get(uid)).Build()).Error()
|
||||
}
|
||||
|
||||
func newWebCache() *redisWebCache {
|
||||
s := conf.CacheSetting
|
||||
return &redisWebCache{
|
||||
cscExpire: s.CientSideCacheExpire,
|
||||
unreadMsgExpire: s.UnreadMsgExpire,
|
||||
c: conf.MustRedisClient(),
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
// Copyright 2023 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package joint
|
||||
|
||||
import (
|
||||
stdJson "encoding/json"
|
||||
|
||||
"github.com/rocboss/paopao-ce/pkg/json"
|
||||
)
|
||||
|
||||
func RespMarshal(data any) (stdJson.RawMessage, error) {
|
||||
return json.Marshal(data)
|
||||
}
|
@ -0,0 +1,84 @@
|
||||
// Copyright 2023 ROC. All rights reserved.
|
||||
// Use of this source code is governed by a MIT style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package web
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/alimy/tryst/event"
|
||||
"github.com/rocboss/paopao-ce/internal/core"
|
||||
"github.com/rocboss/paopao-ce/internal/core/ms"
|
||||
"github.com/rocboss/paopao-ce/internal/events"
|
||||
"github.com/rocboss/paopao-ce/internal/model/joint"
|
||||
"github.com/rocboss/paopao-ce/internal/model/web"
|
||||
)
|
||||
|
||||
type cacheUnreadMsgEvent struct {
|
||||
event.UnimplementedEvent
|
||||
ds core.DataService
|
||||
wc core.WebCache
|
||||
uid int64
|
||||
}
|
||||
|
||||
type createMessageEvent struct {
|
||||
event.UnimplementedEvent
|
||||
ds core.DataService
|
||||
wc core.WebCache
|
||||
message *ms.Message
|
||||
}
|
||||
|
||||
func onCacheUnreadMsgEvent(uid int64) {
|
||||
events.OnEvent(&cacheUnreadMsgEvent{
|
||||
ds: _ds,
|
||||
wc: _wc,
|
||||
uid: uid,
|
||||
})
|
||||
}
|
||||
|
||||
func onCreateMessageEvent(data *ms.Message) {
|
||||
events.OnEvent(&createMessageEvent{
|
||||
ds: _ds,
|
||||
wc: _wc,
|
||||
message: data,
|
||||
})
|
||||
}
|
||||
|
||||
func (e *cacheUnreadMsgEvent) Name() string {
|
||||
return "cacheUnreadMsgEvent"
|
||||
}
|
||||
|
||||
func (e *cacheUnreadMsgEvent) Action() error {
|
||||
count, err := e.ds.GetUnreadCount(e.uid)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cacheUnreadMsgEvent action occurs error: %w", err)
|
||||
}
|
||||
resp := &joint.JsonResp{
|
||||
Code: 0,
|
||||
Msg: "success",
|
||||
Data: &web.GetUnreadMsgCountResp{
|
||||
Count: count,
|
||||
},
|
||||
}
|
||||
data, err := json.Marshal(resp)
|
||||
if err != nil {
|
||||
return fmt.Errorf("cacheUnreadMsgEvent action marshal resp occurs error: %w", err)
|
||||
}
|
||||
if err = e.wc.PutUnreadMsgCountResp(e.uid, data); err != nil {
|
||||
return fmt.Errorf("cacheUnreadMsgEvent action put resp data to redis cache occurs error: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (e *createMessageEvent) Name() string {
|
||||
return "createMessageEvent"
|
||||
}
|
||||
|
||||
func (e *createMessageEvent) Action() (err error) {
|
||||
if _, err = e.ds.CreateMessage(e.message); err == nil {
|
||||
err = e.wc.DelUnreadMsgCountResp(e.message.ReceiverUserID)
|
||||
}
|
||||
return
|
||||
}
|
Loading…
Reference in new issue