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.
142 lines
3.5 KiB
142 lines
3.5 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
|
|
"go-common/library/cache/redis" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_addPrefix2 = "nca_" |
|
) |
|
|
|
func hashField(aid, tp int64) int64 { |
|
return aid*1000 + tp |
|
} |
|
|
|
func addKey2(mid int64) (key string) { |
|
key = _addPrefix2 + strconv.FormatInt(mid, 10) |
|
return |
|
} |
|
|
|
// CoinsAddedCache get coin added of archive. |
|
func (d *Dao) CoinsAddedCache(c context.Context, mid, aid, tp int64) (added int64, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
key := addKey2(mid) |
|
if added, err = redis.Int64(conn.Do("HGET", key, hashField(aid, tp))); err != nil { |
|
if err == redis.ErrNil { |
|
err = nil |
|
return |
|
} |
|
PromError("redis:CoinsAddedCache") |
|
log.Errorv(c, log.KV("log", "redis.Do(HGET)"), log.KV("err", err), log.KV("mid", mid)) |
|
} |
|
return |
|
} |
|
|
|
// SetCoinAddedCache set coin added of archive |
|
func (d *Dao) SetCoinAddedCache(c context.Context, mid, aid, tp, count int64) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
key := addKey2(mid) |
|
defer func() { |
|
if err != nil { |
|
PromError("redis:SetCoinAddedCache") |
|
log.Errorv(c, |
|
log.KV("log", "s.coinDao.SetCoinAdded()"), |
|
log.KV("mid", mid), |
|
log.KV("aid", aid), |
|
log.KV("err", err), |
|
) |
|
} |
|
}() |
|
if err = conn.Send("HSETNX", key, hashField(aid, tp), count); err != nil { |
|
return |
|
} |
|
if err = conn.Send("EXPIRE", key, d.expireAdded); err != nil { |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
return |
|
} |
|
if _, err = redis.Bool(conn.Receive()); err != nil { |
|
return |
|
} |
|
conn.Receive() |
|
return |
|
} |
|
|
|
// SetCoinAddedsCache multiset added cache |
|
func (d *Dao) SetCoinAddedsCache(c context.Context, mid int64, counts map[int64]int64) (err error) { |
|
if len(counts) == 0 { |
|
// 空缓存 |
|
counts = map[int64]int64{-1: -1} |
|
} |
|
key := addKey2(mid) |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
for field, count := range counts { |
|
if err = conn.Send("HSETNX", key, field, count); err != nil { |
|
log.Errorv(c, |
|
log.KV("log", "conn.Send(HSETNX)"), |
|
log.KV("err", err), |
|
log.KV("mid", mid), |
|
) |
|
PromError("redis:SetCoinAddedsCache") |
|
return |
|
} |
|
} |
|
if err = conn.Send("EXPIRE", key, d.expireAdded); err != nil { |
|
log.Errorv(c, |
|
log.KV("log", "conn.Send(EXPIRE)"), |
|
log.KV("err", err), |
|
log.KV("mid", mid), |
|
) |
|
PromError("redis:SetCoinAddedsCache") |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
log.Errorv(c, log.KV("log", "conn.Flush()"), log.KV("err", err), log.KV("mid", mid)) |
|
PromError("redis:SetCoinAddedsCache") |
|
return |
|
} |
|
for i := 0; i < len(counts)+1; i++ { |
|
if _, err = conn.Receive(); err != nil { |
|
log.Errorv(c, log.KV("log", "conn.Recive()"), log.KV("err", err), log.KV("mid", mid)) |
|
PromError("redis:SetCoinAddedsCache") |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
// IncrCoinAddedCache Incr coin added |
|
func (d *Dao) IncrCoinAddedCache(c context.Context, mid, aid, tp, count int64) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
key := addKey2(mid) |
|
if _, err = conn.Do("HINCRBY", key, hashField(aid, tp), count); err != nil { |
|
PromError("redis:IncrCoinAdded") |
|
log.Errorv(c, log.KV("log", "conn.Do(HINCRBY) error"), log.KV("err", err), log.KV("mid", mid), log.KV("aid", aid)) |
|
} |
|
return |
|
} |
|
|
|
// ExpireCoinAdded set expire time for coinadded |
|
func (d *Dao) ExpireCoinAdded(c context.Context, mid int64) (ok bool, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
key := addKey2(mid) |
|
if ok, err = redis.Bool(conn.Do("EXPIRE", key, d.expireAdded)); err != nil { |
|
if err == redis.ErrNil { |
|
err = nil |
|
return |
|
} |
|
PromError("redis:ExpireCoinAdded") |
|
log.Errorv(c, log.KV("log", "conn.Do(EXPIRE)"), log.KV("err", err)) |
|
} |
|
return |
|
}
|
|
|