2019-04-22 02:59:20 +00:00

214 lines
4.6 KiB
Go

package dao
import (
"context"
"strconv"
"go-common/app/service/main/vipinfo/model"
mc "go-common/library/cache/memcache"
"github.com/pkg/errors"
)
const (
_prefixInfo = "i:"
_prefixFrozen = "vipfrozen:"
)
func keyInfo(mid int64) string {
return _prefixInfo + strconv.FormatInt(mid, 10)
}
func keyFrozen(mid int64) string {
return _prefixFrozen + strconv.FormatInt(mid, 10)
}
// pingMC ping memcache.
func (d *Dao) pingMC(c context.Context) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
err = conn.Set(&mc.Item{
Key: "ping",
Value: []byte("pong"),
})
return
}
// CacheInfo get vip info cache.
func (d *Dao) CacheInfo(c context.Context, mid int64) (v *model.VipUserInfo, err error) {
key := keyInfo(mid)
conn := d.mc.Get(c)
defer conn.Close()
r, err := conn.Get(key)
if err != nil {
if err == mc.ErrNotFound {
err = nil
return
}
err = errors.Wrapf(err, "dao cache info")
return
}
v = new(model.VipUserInfo)
if err = conn.Scan(r, v); err != nil {
err = errors.Wrapf(err, "dao cache scan info")
}
return
}
// AddCacheInfo add vip info cache.
func (d *Dao) AddCacheInfo(c context.Context, mid int64, v *model.VipUserInfo) (err error) {
item := &mc.Item{
Key: keyInfo(mid),
Object: v,
Expiration: d.mcExpire,
Flags: mc.FlagProtobuf,
}
conn := d.mc.Get(c)
err = conn.Set(item)
conn.Close()
if err != nil {
err = errors.Wrapf(err, "dao add cache info")
}
return
}
// CacheInfos multi get account info from cache.
func (d *Dao) CacheInfos(c context.Context, mids []int64) (res map[int64]*model.VipUserInfo, err error) {
keys := make([]string, 0, len(mids))
keyMidMap := make(map[string]int64, len(mids))
for _, mid := range mids {
key := keyInfo(mid)
if _, ok := keyMidMap[key]; !ok {
// duplicate mid
keyMidMap[key] = mid
keys = append(keys, key)
}
}
conn := d.mc.Get(c)
defer conn.Close()
rs, err := conn.GetMulti(keys)
if err != nil {
if err == mc.ErrNotFound {
err = nil
return
}
err = errors.Wrap(err, "dao infos cache")
return
}
res = make(map[int64]*model.VipUserInfo, len(mids))
for _, r := range rs {
ai := &model.VipUserInfo{}
conn.Scan(r, ai)
res[keyMidMap[r.Key]] = ai
}
return
}
// AddCacheInfos set account infos cache.
func (d *Dao) AddCacheInfos(c context.Context, vs map[int64]*model.VipUserInfo) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
for mid, i := range vs {
item := &mc.Item{
Key: keyInfo(mid),
Object: i,
Flags: mc.FlagProtobuf,
Expiration: d.mcExpire,
}
err = conn.Set(item)
if err != nil {
err = errors.Wrap(err, "dao add infos cache")
}
}
return
}
// CacheVipFrozens multi get vip frozens from cache.
func (d *Dao) CacheVipFrozens(c context.Context, mids []int64) (res map[int64]int, err error) {
keys := make([]string, 0, len(mids))
keyMidMap := make(map[string]int64, len(mids))
for _, mid := range mids {
key := keyFrozen(mid)
if _, ok := keyMidMap[key]; !ok {
// duplicate mid
keyMidMap[key] = mid
keys = append(keys, key)
}
}
conn := d.mc.Get(c)
defer conn.Close()
rs, err := conn.GetMulti(keys)
if err != nil {
if err == mc.ErrNotFound {
err = nil
return
}
err = errors.Wrap(err, "dao frozens cache")
return
}
res = make(map[int64]int, len(mids))
for _, r := range rs {
ai := 0
conn.Scan(r, &ai)
res[keyMidMap[r.Key]] = ai
}
return
}
//CacheVipFrozen get vip frozen flag.
func (d *Dao) CacheVipFrozen(c context.Context, mid int64) (val int, err error) {
key := keyFrozen(mid)
conn := d.mc.Get(c)
defer conn.Close()
item, err := conn.Get(key)
if err != nil {
if err == mc.ErrNotFound {
err = nil
return
}
err = errors.Wrapf(err, "dao cache frozen")
return
}
if err = conn.Scan(item, &val); err != nil {
err = errors.Wrapf(err, "dao cache scan frozen")
return
}
return
}
// AddCacheFrozen add cache frozen.
func (d *Dao) AddCacheFrozen(c context.Context, mid int64, vipFrozenFlag int) (err error) {
item := &mc.Item{
Key: keyFrozen(mid),
Object: vipFrozenFlag,
Expiration: d.mcExpire,
Flags: mc.FlagJSON,
}
conn := d.mc.Get(c)
err = conn.Set(item)
conn.Close()
if err != nil {
err = errors.Wrapf(err, "dao add cache frozen")
}
return
}
// DelInfoCache del vip info cache.
func (d *Dao) DelInfoCache(c context.Context, mid int64) (err error) {
d.delCache(c, keyInfo(mid))
return
}
func (d *Dao) delCache(c context.Context, key string) (err error) {
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(key); err != nil {
if err == mc.ErrNotFound {
err = nil
} else {
err = errors.Wrapf(err, "del cache")
}
}
return
}