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.
160 lines
4.2 KiB
160 lines
4.2 KiB
package toview |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
|
|
"go-common/app/interface/main/history/model" |
|
"go-common/library/cache/redis" |
|
"go-common/library/log" |
|
) |
|
|
|
const _key = "v_" // mid -> score:time member:aid |
|
|
|
// keyToView return key string |
|
func key(mid int64) string { |
|
return _key + strconv.FormatInt(mid, 10) |
|
} |
|
|
|
// Expire expire toview by mid. |
|
func (d *Dao) Expire(c context.Context, mid int64) (ok bool, err error) { |
|
conn := d.redis.Get(c) |
|
if ok, err = redis.Bool(conn.Do("EXPIRE", key(mid), d.expire)); err != nil { |
|
log.Error("conn.Do(EXPIRE, %s) error(%v)", key(mid), err) |
|
} |
|
conn.Close() |
|
return |
|
} |
|
|
|
// Cache return the user all toview from redis. |
|
func (d *Dao) Cache(c context.Context, mid int64, start, end int) (res []*model.ToView, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
values, err := redis.Values(conn.Do("ZREVRANGE", key(mid), start, end, "WITHSCORES")) |
|
if err != nil { |
|
log.Error("dao.Do(ZREVRANGE %v) error(%v)", key(mid), err) |
|
return |
|
} |
|
if len(values) == 0 { |
|
return |
|
} |
|
res = make([]*model.ToView, 0, len(values)/2) |
|
for len(values) > 0 { |
|
t := &model.ToView{} |
|
if values, err = redis.Scan(values, &t.Aid, &t.Unix); err != nil { |
|
log.Error("redis.Scan(%v) error(%v)", values, err) |
|
return |
|
} |
|
res = append(res, t) |
|
} |
|
return |
|
} |
|
|
|
// CacheMap return the user all toview map from redis. |
|
func (d *Dao) CacheMap(c context.Context, mid int64) (res map[int64]*model.ToView, err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
values, err := redis.Values(conn.Do("ZREVRANGE", key(mid), 0, -1, "WITHSCORES")) |
|
if err != nil { |
|
log.Error("dao.Do(ZREVRANGE %v) error(%v)", key(mid), err) |
|
return |
|
} |
|
if len(values) == 0 { |
|
return |
|
} |
|
res = make(map[int64]*model.ToView, len(values)/2) |
|
for len(values) > 0 { |
|
t := &model.ToView{} |
|
if values, err = redis.Scan(values, &t.Aid, &t.Unix); err != nil { |
|
log.Error("redis.Scan(%v) error(%v)", values, err) |
|
return |
|
} |
|
res[t.Aid] = t |
|
} |
|
return |
|
} |
|
|
|
// CntCache return the user toview count from redis. |
|
func (d *Dao) CntCache(c context.Context, mid int64) (count int, err error) { |
|
conn := d.redis.Get(c) |
|
if count, err = redis.Int(conn.Do("ZCARD", key(mid))); err != nil { |
|
log.Error("dao.Do(ZCARD,%s) err(%v)", key(mid), err) |
|
} |
|
conn.Close() |
|
return |
|
} |
|
|
|
// ClearCache delete the user toview redis. |
|
func (d *Dao) ClearCache(c context.Context, mid int64) (err error) { |
|
conn := d.redis.Get(c) |
|
if _, err = conn.Do("DEL", key(mid)); err != nil { |
|
log.Error("conn.Do(DEL %s) error(%v)", key(mid), err) |
|
} |
|
conn.Close() |
|
return |
|
} |
|
|
|
// DelCaches delete the user toview redis. |
|
func (d *Dao) DelCaches(c context.Context, mid int64, aids []int64) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
for _, aid := range aids { |
|
if err = conn.Send("ZREM", key(mid), aid); err != nil { |
|
log.Error("conn.Send(ZREM %s,%d) error(%v)", key(mid), aid, err) |
|
return |
|
} |
|
} |
|
if err = conn.Flush(); err != nil { |
|
log.Error("conn.Flush() error(%v)", err) |
|
return |
|
} |
|
for i := 0; i < len(aids); i++ { |
|
if _, err = conn.Receive(); err != nil { |
|
log.Error("conn.Receive() error(%v)", err) |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
// AddCache add user toview to redis. |
|
func (d *Dao) AddCache(c context.Context, mid, aid, now int64) error { |
|
return d.addCache(c, key(mid), []*model.ToView{&model.ToView{Aid: aid, Unix: now}}) |
|
} |
|
|
|
// AddCacheList add user toview to redis. |
|
func (d *Dao) AddCacheList(c context.Context, mid int64, views []*model.ToView) error { |
|
return d.addCache(c, key(mid), views) |
|
} |
|
|
|
// addCache add user toview to redis. |
|
func (d *Dao) addCache(c context.Context, key string, views []*model.ToView) (err error) { |
|
conn := d.redis.Get(c) |
|
defer conn.Close() |
|
for _, v := range views { |
|
if err = conn.Send("ZADD", key, v.Unix, v.Aid); err != nil { |
|
log.Error("conn.Send(ZREM %s,%d) error(%v)", key, v.Aid, err) |
|
return |
|
} |
|
} |
|
if err = conn.Send("EXPIRE", key, d.expire); err != nil { |
|
log.Error("conn.Send(EXPIRE) error(%v)", err) |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
log.Error("conn.Flush() error(%v)", err) |
|
return |
|
} |
|
for i := 0; i < len(views)+1; i++ { |
|
if _, err = conn.Receive(); err != nil { |
|
log.Error("conn.Receive() error(%v)", err) |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
// PingRedis check redis connection |
|
func (d *Dao) PingRedis(c context.Context) (err error) { |
|
return |
|
}
|
|
|