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.
93 lines
2.2 KiB
93 lines
2.2 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
|
|
"go-common/app/job/main/reply-feed/model" |
|
"go-common/library/cache/memcache" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_replyStatFormat = "rs_%d" |
|
) |
|
|
|
// PingMc ping |
|
func (d *Dao) PingMc(ctx context.Context) (err error) { |
|
conn := d.mc.Get(ctx) |
|
defer conn.Close() |
|
item := memcache.Item{Key: "ping", Value: []byte("pong"), Expiration: 0} |
|
return conn.Set(&item) |
|
} |
|
|
|
func keyReplyStat(rpID int64) string { |
|
return fmt.Sprintf(_replyStatFormat, rpID) |
|
} |
|
|
|
// RemReplyStatMc ... |
|
func (d *Dao) RemReplyStatMc(ctx context.Context, rpID int64) (err error) { |
|
conn := d.mc.Get(ctx) |
|
defer conn.Close() |
|
return conn.Delete(keyReplyStat(rpID)) |
|
} |
|
|
|
// SetReplyStatMc set reply stat into mc. |
|
func (d *Dao) SetReplyStatMc(ctx context.Context, rs *model.ReplyStat) (err error) { |
|
conn := d.mc.Get(ctx) |
|
defer conn.Close() |
|
key := keyReplyStat(rs.RpID) |
|
item := &memcache.Item{ |
|
Key: key, |
|
Object: rs, |
|
Expiration: d.mcExpire, |
|
Flags: memcache.FlagJSON, |
|
} |
|
if err = conn.Set(item); err != nil { |
|
log.Error("memcache Set(%s, %v), error(%v)", key, item, err) |
|
} |
|
return |
|
} |
|
|
|
// ReplyStatsMc get multi repies stat from memcache. |
|
func (d *Dao) ReplyStatsMc(ctx context.Context, rpIDs []int64) (rsMap map[int64]*model.ReplyStat, missIDs []int64, err error) { |
|
rsMap = make(map[int64]*model.ReplyStat) |
|
keys := make([]string, len(rpIDs)) |
|
mapping := make(map[string]int64) |
|
for i, rpID := range rpIDs { |
|
key := keyReplyStat(rpID) |
|
keys[i] = key |
|
mapping[key] = rpID |
|
} |
|
for _, chunkedKeys := range splitString(keys, 2000) { |
|
var ( |
|
conn = d.mc.Get(ctx) |
|
items map[string]*memcache.Item |
|
) |
|
if items, err = conn.GetMulti(chunkedKeys); err != nil { |
|
if err == memcache.ErrNotFound { |
|
missIDs = rpIDs |
|
err = nil |
|
conn.Close() |
|
return |
|
} |
|
conn.Close() |
|
log.Error("memcache GetMulti error(%v)", err) |
|
return |
|
} |
|
for _, item := range items { |
|
stat := new(model.ReplyStat) |
|
if err = conn.Scan(item, stat); err != nil { |
|
log.Error("memcache Scan(%v) error(%v)", item.Value, err) |
|
continue |
|
} |
|
rsMap[mapping[item.Key]] = stat |
|
delete(mapping, item.Key) |
|
} |
|
conn.Close() |
|
} |
|
for _, rpID := range mapping { |
|
missIDs = append(missIDs, rpID) |
|
} |
|
return |
|
}
|
|
|