163 lines
4.7 KiB
Go
163 lines
4.7 KiB
Go
|
package dao
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"go-common/app/interface/main/push-archive/model"
|
||
|
"go-common/library/cache/redis"
|
||
|
"go-common/library/log"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
_prefixUpperLimit = "pau_%d"
|
||
|
_prefixFanLimit = "paf_%d"
|
||
|
_statisticsKey = "statistics_push_archive"
|
||
|
_prefixPerUpperLimit = "perup_%d_%d"
|
||
|
)
|
||
|
|
||
|
func (d *Dao) do(c context.Context, command string, key string, args ...interface{}) (reply interface{}, err error) {
|
||
|
conn := d.redis.Get(c)
|
||
|
defer conn.Close()
|
||
|
|
||
|
values := []interface{}{key}
|
||
|
if len(args) > 0 {
|
||
|
values = append(values, args...)
|
||
|
}
|
||
|
reply, err = conn.Do(command, values...)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func upperLimitKey(mid int64) string {
|
||
|
return fmt.Sprintf(_prefixUpperLimit, mid)
|
||
|
}
|
||
|
|
||
|
// pingRedis ping redis.
|
||
|
func (d *Dao) pingRedis(c context.Context) (err error) {
|
||
|
if _, err = d.do(c, "SET", "PING", "PONG"); err != nil {
|
||
|
PromError("redis: ping remote")
|
||
|
log.Error("remote redis: conn.Do(SET,PING,PONG) error(%v)", err)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ExistUpperLimitCache judge that whether upper push limit cache exists.
|
||
|
func (d *Dao) ExistUpperLimitCache(c context.Context, upper int64) (exist bool, err error) {
|
||
|
key := upperLimitKey(upper)
|
||
|
if exist, err = redis.Bool(d.do(c, "EXISTS", key)); err != nil {
|
||
|
PromError("redis:读取upper推送限制")
|
||
|
log.Error("ExistUpperLimitCache do(EXISTS, %s) error(%v)", key, err)
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// AddUpperLimitCache sets upper push limit cache.
|
||
|
func (d *Dao) AddUpperLimitCache(c context.Context, upper int64) (err error) {
|
||
|
key := upperLimitKey(upper)
|
||
|
if _, err = d.do(c, "SETEX", key, d.UpperLimitExpire, ""); err != nil {
|
||
|
PromError("redis:添加upper推送限制")
|
||
|
log.Error("AddUpperLimitCache do(SETEX, %s) error(%v)", key, err)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//fanLimitKey 粉丝推送总次数限制key
|
||
|
func fanLimitKey(fan int64, relationType int) string {
|
||
|
key := fmt.Sprintf(_prefixFanLimit, fan)
|
||
|
if relationType != model.RelationSpecial {
|
||
|
key = fmt.Sprintf("%s_%d", key, relationType)
|
||
|
}
|
||
|
return key
|
||
|
}
|
||
|
|
||
|
//GetFanLimitCache 读取粉丝限制的当前值
|
||
|
func (d *Dao) GetFanLimitCache(c context.Context, fan int64, relationType int) (limit int, err error) {
|
||
|
key := fanLimitKey(fan, relationType)
|
||
|
if limit, err = redis.Int(d.do(c, "GET", key)); err != nil {
|
||
|
if err == redis.ErrNil {
|
||
|
err = nil
|
||
|
} else {
|
||
|
log.Error("GetFanLimitCache do(GET) error(%v)", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//AddFanLimitCache 添加粉丝限制的缓存
|
||
|
func (d *Dao) AddFanLimitCache(c context.Context, fan int64, relationType int, value int, expire int32) (err error) {
|
||
|
key := fanLimitKey(fan, relationType)
|
||
|
if _, err = d.do(c, "SETEX", key, expire, value); err != nil {
|
||
|
log.Error("AddFanLimitCache do(SETEX) error(%v)", err)
|
||
|
PromError("redis:添加fan推送限制")
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//AddStatisticsCache 添加统计数据到redis
|
||
|
func (d *Dao) AddStatisticsCache(c context.Context, ps *model.PushStatistic) (err error) {
|
||
|
psByte, err := json.Marshal(*ps)
|
||
|
if err != nil {
|
||
|
log.Error("AddStatisticsCache json.Marshal error(%v), pushstatistic(%v)", err, ps)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
key := _statisticsKey
|
||
|
if _, err = d.do(c, "LPUSH", key, string(psByte)); err != nil {
|
||
|
log.Error("AddStatisticsCache do(LPUSH, %s) error(%v) pushstatistic(%v)", key, err, ps)
|
||
|
PromError("redis:添加统计数据")
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//GetStatisticsCache 读取一条统计数据
|
||
|
func (d *Dao) GetStatisticsCache(c context.Context) (ps *model.PushStatistic, err error) {
|
||
|
key := _statisticsKey
|
||
|
psStr, err := redis.String(d.do(c, "RPOP", key))
|
||
|
if err != nil {
|
||
|
if err == redis.ErrNil {
|
||
|
err = nil
|
||
|
} else {
|
||
|
log.Error("GetStatisticsCache do(RPOP, %s) error(%v)", key, err)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if err = json.Unmarshal([]byte(psStr), &ps); err != nil {
|
||
|
log.Error("GetStatisticsCache json.Unmarshal error(%v), ps(%s)", err, psStr)
|
||
|
return
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//perUpperLimitKey 粉丝每个upper主的推送次数限制key
|
||
|
func perUpperLimitKey(fan int64, upper int64) string {
|
||
|
return fmt.Sprintf(_prefixPerUpperLimit, fan, upper)
|
||
|
}
|
||
|
|
||
|
//GetPerUpperLimitCache 粉丝每个upper主的已推送次数
|
||
|
func (d *Dao) GetPerUpperLimitCache(c context.Context, fan int64, upper int64) (limit int, err error) {
|
||
|
key := perUpperLimitKey(fan, upper)
|
||
|
if limit, err = redis.Int(d.do(c, "GET", key)); err != nil {
|
||
|
if err == redis.ErrNil {
|
||
|
err = nil
|
||
|
} else {
|
||
|
log.Error("GetPerUpperLimitCache do(GET, %s) error(%v)", key, err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
//AddPerUpperLimitCache 添加粉丝每个up主的推送次数
|
||
|
func (d *Dao) AddPerUpperLimitCache(c context.Context, fan int64, upper int64, value int, expire int32) (err error) {
|
||
|
key := perUpperLimitKey(fan, upper)
|
||
|
if _, err = d.do(c, "SETEX", key, expire, value); err != nil {
|
||
|
log.Error("AddPerUpperLimitCache do(SETEX, %s, %d, %d) error(%v)", key, expire, value, err)
|
||
|
PromError("redis:添加perupper推送限制")
|
||
|
}
|
||
|
return
|
||
|
}
|