123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package archive
- import (
- "context"
- "fmt"
- "runtime"
- "go-common/app/interface/main/app-player/conf"
- "go-common/app/interface/main/app-player/model/archive"
- arcrpc "go-common/app/service/main/archive/api"
- "go-common/library/cache/memcache"
- "go-common/library/log"
- )
- // Dao is archive dao.
- type Dao struct {
- // memcache
- arcMc *memcache.Pool
- // chan
- mCh chan func()
- // rpc
- arcRPC arcrpc.ArchiveClient
- }
- // New new a archive dao.
- func New(c *conf.Config) (d *Dao) {
- d = &Dao{
- // memcache
- arcMc: memcache.NewPool(c.Memcache),
- // mc proc
- mCh: make(chan func(), 1024),
- }
- var err error
- d.arcRPC, err = arcrpc.NewClient(c.ArchiveClient)
- if err != nil {
- panic(fmt.Sprintf("archive NewClient error(%v)", err))
- }
- for i := 0; i < runtime.NumCPU(); i++ {
- go d.cacheproc()
- }
- return
- }
- // Ping ping check memcache connection
- func (d *Dao) Ping(c context.Context) (err error) {
- return d.pingMC(c)
- }
- // addCache add archive to mc or redis
- func (d *Dao) addCache(f func()) {
- select {
- case d.mCh <- f:
- default:
- log.Warn("cacheproc chan full")
- }
- }
- // cacheproc write memcache and stat redis use goroutine
- func (d *Dao) cacheproc() {
- for {
- f, ok := <-d.mCh
- if !ok {
- return
- }
- f()
- }
- }
- // ArchiveCache is
- func (d *Dao) ArchiveCache(c context.Context, aid int64) (arc *archive.Info, err error) {
- if arc, err = d.archiveCache(c, aid); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- if arc != nil {
- return
- }
- var (
- view *arcrpc.ViewReply
- cids []int64
- )
- if view, err = d.arcRPC.View(c, &arcrpc.ViewRequest{Aid: aid}); err != nil {
- log.Error("d.arcRPC.View3(%d) error(%+v)", aid, err)
- return
- }
- for _, p := range view.Pages {
- cids = append(cids, p.Cid)
- }
- arc = &archive.Info{
- Aid: view.Arc.Aid,
- State: view.Arc.State,
- Mid: view.Arc.Author.Mid,
- Cids: cids,
- Attribute: view.Arc.Attribute,
- }
- d.addCache(func() {
- d.addArchiveCache(context.Background(), aid, arc)
- })
- return
- }
- // Views is
- func (d *Dao) Views(c context.Context, aids []int64) (arcs map[int64]*archive.Info, err error) {
- var reply *arcrpc.ViewsReply
- if reply, err = d.arcRPC.Views(c, &arcrpc.ViewsRequest{Aids: aids}); err != nil {
- return
- }
- arcs = make(map[int64]*archive.Info)
- for _, v := range reply.Views {
- var (
- info = new(archive.Info)
- cids []int64
- )
- info.Aid = v.Arc.Aid
- info.State = v.Arc.State
- info.Mid = v.Arc.Author.Mid
- info.Attribute = v.Arc.Attribute
- for _, p := range v.Pages {
- cids = append(cids, p.Cid)
- }
- info.Cids = cids
- arcs[info.Aid] = info
- }
- return
- }
|