123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package dao
- import (
- "context"
- "fmt"
- "os"
- "time"
- "go-common/library/cache/redis"
- )
- const (
- _expShard = 10000
- _expAddedPrefix = "ea_%s_%d_%d"
- _expire = 86400
- )
- func expAddedKey(tp string, mid int64, day int) string {
- return fmt.Sprintf(_expAddedPrefix, tp, day, mid/_expShard)
- }
- func leader() (key string, value string) {
- value, _ = os.Hostname()
- key = fmt.Sprintf("member-job:leader:%d", time.Now().Day())
- return key, value
- }
- // SetExpAdded set user exp added of tp,
- func (d *Dao) SetExpAdded(c context.Context, mid int64, day int, tp string) (b bool, err error) {
- conn := d.redis.Get(c)
- defer conn.Close()
- if err = conn.Send("SETBIT", expAddedKey(tp, mid, day), mid%_expShard, 1); err != nil {
- return
- }
- if err = conn.Send("EXPIRE", expAddedKey(tp, mid, day), _expire); err != nil {
- return
- }
- if err = conn.Flush(); err != nil {
- return
- }
- if b, err = redis.Bool(conn.Receive()); err != nil {
- return
- }
- conn.Receive()
- return
- }
- // ExpAdded check if user had add exp.
- func (d *Dao) ExpAdded(c context.Context, mid int64, day int, tp string) (b bool, err error) {
- conn := d.redis.Get(c)
- b, err = redis.Bool(conn.Do("GETBIT", expAddedKey(tp, mid, day), mid%_expShard))
- conn.Close()
- return
- }
- // LeaderEleciton eleciton job leader.
- func (d *Dao) LeaderEleciton(c context.Context) (elected bool) {
- key, value := leader()
- conn := d.redis.Get(c)
- elected, _ = redis.Bool(conn.Do("SETNX", key, value))
- if elected {
- conn.Do("EXPIRE", key, 600)
- }
- conn.Close()
- return
- }
|