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.
120 lines
2.7 KiB
120 lines
2.7 KiB
package video |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
|
|
"go-common/app/service/main/favorite/model" |
|
"go-common/library/cache/redis" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_covers = "fcs_" |
|
) |
|
|
|
func coversKey(mid, fid int64) string { |
|
return fmt.Sprintf("%s%d_%d", _covers, mid, fid) |
|
} |
|
|
|
// pingRedis check redis connection |
|
func (d *Dao) pingRedis(c context.Context) (err error) { |
|
conn := d.redisPool.Get(c) |
|
_, err = conn.Do("SET", "PING", "PONG") |
|
conn.Close() |
|
return |
|
} |
|
|
|
// SetNewCoverCache set fav's cover to cache |
|
func (d *Dao) SetNewCoverCache(c context.Context, mid, fid int64, covers []*model.Cover) (err error) { |
|
key := coversKey(mid, fid) |
|
conn := d.redisPool.Get(c) |
|
defer conn.Close() |
|
for _, cover := range covers { |
|
var bs []byte |
|
if bs, err = json.Marshal(cover); err != nil { |
|
log.Error("json.Marshal(%v) err(%v)", cover, err) |
|
return |
|
} |
|
if err = conn.Send("RPUSH", key, bs); err != nil { |
|
log.Error("conn.Send RPUSH error(%v)", err) |
|
return |
|
} |
|
} |
|
if err = conn.Send("EXPIRE", key, d.coverExpireRedis); err != nil { |
|
log.Error("conn.Send(EXPIRE) err(%v)", err) |
|
return |
|
} |
|
if err = conn.Flush(); err != nil { |
|
log.Error("conn.Flush err(%v)", err) |
|
return |
|
} |
|
for i := 0; i < len(covers)+1; i++ { |
|
if _, err = conn.Receive(); err != nil { |
|
log.Error("conn.Receive error(%v)", err) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// NewCoversCache get multi cover of fids by pipeline |
|
func (d *Dao) NewCoversCache(c context.Context, mid int64, fids []int64) (fcvs map[int64][]*model.Cover, mis []int64, err error) { |
|
conn := d.redisPool.Get(c) |
|
defer conn.Close() |
|
for _, fid := range fids { |
|
key := coversKey(mid, fid) |
|
if err = conn.Send("LRANGE", key, 0, 2); err != nil { |
|
log.Error("conn.Send(LRANGE) err(%v)", err) |
|
return |
|
} |
|
} |
|
if err = conn.Flush(); err != nil { |
|
log.Error("conn.Flush() err(%v)", err) |
|
return |
|
} |
|
fcvs = make(map[int64][]*model.Cover, len(fids)) |
|
// receive lrange |
|
for i := 0; i < len(fids); i++ { |
|
var ( |
|
bbs [][]byte |
|
cvs []*model.Cover |
|
) |
|
if bbs, err = redis.ByteSlices(conn.Receive()); err != nil { |
|
if err == redis.ErrNil { |
|
err = nil |
|
mis = append(mis, fids[i]) |
|
continue |
|
} |
|
log.Error("redis.ByteSlices err(%v)", err) |
|
return |
|
} |
|
if len(bbs) == 0 { |
|
mis = append(mis, fids[i]) |
|
continue |
|
} |
|
for _, bs := range bbs { |
|
cv := &model.Cover{} |
|
if err = json.Unmarshal(bs, cv); err != nil { |
|
log.Error("json.Unmarshal err(%v)", err) |
|
return |
|
} |
|
cvs = append(cvs, cv) |
|
} |
|
fcvs[fids[i]] = cvs |
|
} |
|
return |
|
} |
|
|
|
// DelCoverCache delete folder cover |
|
func (d *Dao) DelCoverCache(c context.Context, mid, fid int64) (err error) { |
|
var ( |
|
key = coversKey(mid, fid) |
|
conn = d.redisPool.Get(c) |
|
) |
|
defer conn.Close() |
|
if _, err = conn.Do("DEL", key); err != nil { |
|
log.Error("conn.Do(DEL, %s) error(%v)", key, err) |
|
} |
|
return |
|
}
|
|
|