bilibili-backup/app/service/main/relation/dao/prompt_redis.go
2019-04-22 02:59:20 +00:00

79 lines
2.1 KiB
Go

package dao
import (
"context"
"fmt"
"go-common/library/cache/redis"
)
const (
_cacheShard = 10000
_upPrompt = "rl_up_%d_%d" // key of upper prompt; hashes(fid-count)
_buPrompt = "rl_bu_%d_%d_%d" // key of business type prompt;hashes(mid-count)
)
// key upPrompt : rl_up_mid_ts/period
func (d *Dao) upPrompt(mid, ts int64) string {
return fmt.Sprintf(_upPrompt, mid, ts/d.period)
}
// key _buPrompt : rl_bu_businesstype_mid/10000_ts
func (d *Dao) buPrompt(btype int8, mid, ts int64) string {
return fmt.Sprintf(_buPrompt, btype, mid/_cacheShard, ts/d.period)
}
// IncrPromptCount incr up prompt count and business type prompt count.
func (d *Dao) IncrPromptCount(c context.Context, mid, fid, ts int64, btype int8) (ucount, bcount int64, err error) {
conn := d.redis.Get(c)
defer conn.Close()
keyUp := d.upPrompt(mid, ts)
keyBs := d.buPrompt(btype, mid, ts)
conn.Send("HINCRBY", keyUp, fid, 1)
conn.Send("EXPIRE", keyUp, d.period)
conn.Send("HINCRBY", keyBs, mid, 1)
conn.Send("EXPIRE", keyBs, d.period)
err = conn.Flush()
if err != nil {
return
}
ucount, err = redis.Int64(conn.Receive())
if err != nil {
return
}
conn.Receive()
bcount, err = redis.Int64(conn.Receive())
if err != nil {
return
}
conn.Receive()
return
}
// ClosePrompt set prompt count to max config value.
func (d *Dao) ClosePrompt(c context.Context, mid, fid, ts int64, btype int8) (err error) {
conn := d.redis.Get(c)
defer conn.Close()
keyUp := d.upPrompt(mid, ts)
keyBs := d.buPrompt(btype, mid, ts)
conn.Send("HSET", keyUp, fid, d.ucount)
conn.Send("HSET", keyBs, mid, d.bcount)
return conn.Flush()
}
// UpCount get upper prompt count.
func (d *Dao) UpCount(c context.Context, mid, fid, ts int64) (count int64, err error) {
conn := d.redis.Get(c)
count, err = redis.Int64(conn.Do("HGET", d.upPrompt(mid, ts), fid))
conn.Close()
return
}
// BCount get business type prompt count.
func (d *Dao) BCount(c context.Context, mid, ts int64, btype int8) (count int64, err error) {
conn := d.redis.Get(c)
count, err = redis.Int64(conn.Do("HGET", d.buPrompt(btype, mid, ts), mid))
conn.Close()
return
}