You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.7 KiB
162 lines
4.7 KiB
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 |
|
}
|
|
|