123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 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
- }
|