214 lines
4.6 KiB
Go
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
|
|
}
|