go-common/app/interface/main/credit/dao/case_redis.go
2019-04-22 18:49:16 +08:00

153 lines
3.7 KiB
Go

package dao
import (
"context"
"fmt"
"strconv"
model "go-common/app/interface/main/credit/model"
"go-common/library/cache/redis"
)
const (
_voteOpIdx = "vo_%d_%d"
_caseOpIdx = "caseop_"
)
func voteIndexKey(cid int64, otype int8) string {
return fmt.Sprintf(_voteOpIdx, otype, cid)
}
func caseIndexKey(cid int64) string {
return _caseOpIdx + strconv.FormatInt(cid, 10)
}
// VoteOpIdxCache get vote opinion index from cache.
func (d *Dao) VoteOpIdxCache(c context.Context, cid, start, end int64, otype int8) (ids []int64, err error) {
var (
key = voteIndexKey(cid, otype)
conn = d.redis.Get(c)
)
defer conn.Close()
ids, err = redis.Int64s(conn.Do("LRANGE", key, start, end))
return
}
// ExpireVoteIdx expire vote idx.
func (d *Dao) ExpireVoteIdx(c context.Context, cid int64, otype int8) (ok bool, err error) {
conn := d.redis.Get(c)
defer conn.Close()
ok, err = redis.Bool(conn.Do("EXPIRE", voteIndexKey(cid, otype), d.redisExpire))
return
}
// LenVoteIdx get lenth of vote index.
func (d *Dao) LenVoteIdx(c context.Context, cid int64, otype int8) (count int, err error) {
conn := d.redis.Get(c)
defer conn.Close()
count, err = redis.Int(conn.Do("LLEN", voteIndexKey(cid, otype)))
return
}
// CaseOpIdxCache get case opinion index from cache.
func (d *Dao) CaseOpIdxCache(c context.Context, cid, start, end int64) (ids []int64, err error) {
var (
key = caseIndexKey(cid)
conn = d.redis.Get(c)
)
defer conn.Close()
ids, err = redis.Int64s(conn.Do("ZREVRANGE", key, start, end))
return
}
// LenCaseIdx get lenth of vote index.
func (d *Dao) LenCaseIdx(c context.Context, cid int64) (count int, err error) {
conn := d.redis.Get(c)
defer conn.Close()
count, err = redis.Int(conn.Do("ZCARD", caseIndexKey(cid)))
return
}
// ExpireCaseIdx expire case index cache.
func (d *Dao) ExpireCaseIdx(c context.Context, cid int64) (ok bool, err error) {
conn := d.redis.Get(c)
defer conn.Close()
ok, err = redis.Bool(conn.Do("EXPIRE", caseIndexKey(cid), d.redisExpire))
return
}
// LoadVoteOpIdxs load vote opinion index into cache.
func (d *Dao) LoadVoteOpIdxs(c context.Context, cid int64, otype int8, idx []int64) (err error) {
var (
ok bool
key = voteIndexKey(cid, otype)
conn = d.redis.Get(c)
)
defer conn.Close()
if ok, err = redis.Bool(conn.Do("EXPIRE", key, d.redisExpire)); ok {
return
}
for _, id := range idx {
if err = conn.Send("LPUSH", key, id); err != nil {
return
}
}
if err = conn.Send("EXPIRE", key, d.redisExpire); err != nil {
return
}
if err = conn.Flush(); err != nil {
return
}
for i := 0; i < len(idx)+1; i++ {
_, err = conn.Receive()
}
return
}
// LoadCaseIdxs load case opinion index into redis.
func (d *Dao) LoadCaseIdxs(c context.Context, cid int64, ops []*model.Opinion) (err error) {
key := caseIndexKey(cid)
conn := d.redis.Get(c)
defer conn.Close()
for _, op := range ops {
if err = conn.Send("ZADD", key, op.Like-op.Hate, op.OpID); err != nil {
return
}
}
if err = conn.Send("EXPIRE", key, d.redisExpire); err != nil {
return
}
if err = conn.Flush(); err != nil {
return
}
for i := 0; i < len(ops)+1; i++ {
_, err = conn.Receive()
}
return
}
// DelCaseIdx DEL case opinion idx.
func (d *Dao) DelCaseIdx(c context.Context, cid int64) (err error) {
conn := d.redis.Get(c)
defer conn.Close()
_, err = conn.Do("DEL", caseIndexKey(cid))
return
}
// DelVoteIdx DEL case opinion idx.
func (d *Dao) DelVoteIdx(c context.Context, cid int64) (err error) {
conn := d.redis.Get(c)
defer conn.Close()
if err = conn.Send("DEL", voteIndexKey(cid, 1)); err != nil {
return
}
if err = conn.Send("DEL", voteIndexKey(cid, 2)); err != nil {
return
}
conn.Flush()
for i := 0; i < 2; i++ {
conn.Receive()
}
return
}