2019-04-22 02:59:20 +00:00

139 lines
3.6 KiB
Go

package space
import (
"context"
"runtime"
"time"
"go-common/app/interface/main/app-interface/conf"
accdao "go-common/app/interface/main/app-interface/dao/account"
arcdao "go-common/app/interface/main/app-interface/dao/archive"
artdao "go-common/app/interface/main/app-interface/dao/article"
audiodao "go-common/app/interface/main/app-interface/dao/audio"
bgmdao "go-common/app/interface/main/app-interface/dao/bangumi"
bplusdao "go-common/app/interface/main/app-interface/dao/bplus"
coindao "go-common/app/interface/main/app-interface/dao/coin"
commdao "go-common/app/interface/main/app-interface/dao/community"
elecdao "go-common/app/interface/main/app-interface/dao/elec"
favdao "go-common/app/interface/main/app-interface/dao/favorite"
livedao "go-common/app/interface/main/app-interface/dao/live"
memberdao "go-common/app/interface/main/app-interface/dao/member"
paydao "go-common/app/interface/main/app-interface/dao/pay"
reldao "go-common/app/interface/main/app-interface/dao/relation"
srchdao "go-common/app/interface/main/app-interface/dao/search"
shopdao "go-common/app/interface/main/app-interface/dao/shop"
spcdao "go-common/app/interface/main/app-interface/dao/space"
tagdao "go-common/app/interface/main/app-interface/dao/tag"
thumbupdao "go-common/app/interface/main/app-interface/dao/thumbup"
"go-common/library/log"
)
// Service is space service
type Service struct {
c *conf.Config
arcDao *arcdao.Dao
spcDao *spcdao.Dao
accDao *accdao.Dao
coinDao *coindao.Dao
commDao *commdao.Dao
srchDao *srchdao.Dao
favDao *favdao.Dao
bgmDao *bgmdao.Dao
tagDao *tagdao.Dao
liveDao *livedao.Dao
elecDao *elecdao.Dao
artDao *artdao.Dao
audioDao *audiodao.Dao
relDao *reldao.Dao
bplusDao *bplusdao.Dao
shopDao *shopdao.Dao
thumbupDao *thumbupdao.Dao
payDao *paydao.Dao
memberDao *memberdao.Dao
// chan
mCh chan func()
tick time.Duration
BlackList map[int64]struct{}
}
// New new space
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
arcDao: arcdao.New(c),
spcDao: spcdao.New(c),
accDao: accdao.New(c),
coinDao: coindao.New(c),
commDao: commdao.New(c),
srchDao: srchdao.New(c),
favDao: favdao.New(c),
bgmDao: bgmdao.New(c),
tagDao: tagdao.New(c),
liveDao: livedao.New(c),
elecDao: elecdao.New(c),
artDao: artdao.New(c),
audioDao: audiodao.New(c),
relDao: reldao.New(c),
bplusDao: bplusdao.New(c),
shopDao: shopdao.New(c),
thumbupDao: thumbupdao.New(c),
payDao: paydao.New(c),
memberDao: memberdao.New(c),
// mc proc
mCh: make(chan func(), 1024),
tick: time.Duration(c.Tick),
BlackList: make(map[int64]struct{}),
}
// video db
for i := 0; i < runtime.NumCPU(); i++ {
go s.cacheproc()
}
if c != nil && c.Space != nil {
for _, mid := range c.Space.ForbidMid {
s.BlackList[mid] = struct{}{}
}
}
s.loadBlacklist()
go s.blacklistproc()
return
}
// addCache add archive to mc or redis
func (s *Service) addCache(f func()) {
select {
case s.mCh <- f:
default:
log.Warn("cacheproc chan full")
}
}
// cacheproc write memcache and stat redis use goroutine
func (s *Service) cacheproc() {
for {
f := <-s.mCh
f()
}
}
// Ping check server ok
func (s *Service) Ping(c context.Context) (err error) {
return
}
// loadBlacklist
func (s *Service) loadBlacklist() {
list, err := s.spcDao.Blacklist(context.Background())
if err != nil {
log.Error("%+v", err)
return
}
s.BlackList = list
}
func (s *Service) blacklistproc() {
for {
time.Sleep(s.tick)
s.loadBlacklist()
}
}