cache top shouts

This commit is contained in:
knst-kotov
2021-09-01 13:28:42 +03:00
parent eba8e6d6af
commit 41413242bd
2 changed files with 62 additions and 30 deletions

View File

@@ -67,40 +67,72 @@ class GitTask:
print("git task worker error = %s" % (err))
class TopShouts:
limit = 50
period = 60*60 #1 hour
lock = asyncio.Lock()
@staticmethod
async def prepare_shouts_by_rating():
month_ago = datetime.now() - timedelta(days = 30)
with local_session() as session:
stmt = select(Shout, func.sum(ShoutRating.value).label("rating")).\
join(ShoutRating).\
where(ShoutRating.ts > month_ago).\
group_by(Shout.id).\
order_by(desc("rating")).\
limit(TopShouts.limit)
shouts = []
for row in session.execute(stmt):
shout = row.Shout
shout.rating = row.rating
shouts.append(shout)
async with TopShouts.lock:
TopShouts.shouts_by_rating = shouts
@staticmethod
async def prepare_shouts_by_view():
month_ago = datetime.now() - timedelta(days = 30)
with local_session() as session:
stmt = select(Shout, func.sum(ShoutViewByDay.value).label("view")).\
join(ShoutViewByDay).\
where(ShoutViewByDay.day > month_ago).\
group_by(Shout.id).\
order_by(desc("view")).\
limit(TopShouts.limit)
shouts = []
for row in session.execute(stmt):
shout = row.Shout
shout.view = row.view
shouts.append(shout)
async with TopShouts.lock:
TopShouts.shouts_by_view = shouts
@staticmethod
async def worker():
print("top shouts worker start")
while True:
try:
print("top shouts: update cache")
await TopShouts.prepare_shouts_by_rating()
await TopShouts.prepare_shouts_by_view()
print("top shouts: update finished")
except Exception as err:
print("top shouts worker error = %s" % (err))
await asyncio.sleep(TopShouts.period)
@query.field("topShoutsByView")
async def top_shouts_by_view(_, info, limit):
month_ago = datetime.now() - timedelta(days = 30)
with local_session() as session:
stmt = select(Shout, func.sum(ShoutViewByDay.value).label("view")).\
join(ShoutViewByDay).\
where(ShoutViewByDay.day > month_ago).\
group_by(Shout.id).\
order_by(desc("view")).\
limit(limit)
shouts = []
for row in session.execute(stmt):
shout = row.Shout
shout.view = row.view
shouts.append(shout)
return shouts
async with TopShouts.lock:
return TopShouts.shouts_by_view[:limit]
@query.field("topShoutsByRating")
async def top_shouts(_, info, limit):
month_ago = datetime.now() - timedelta(days = 30)
with local_session() as session:
stmt = select(Shout, func.sum(ShoutRating.value).label("rating")).\
join(ShoutRating).\
where(ShoutRating.ts > month_ago).\
group_by(Shout.id).\
order_by(desc("rating")).\
limit(limit)
shouts = []
for row in session.execute(stmt):
shout = row.Shout
shout.rating = row.rating
shouts.append(shout)
return shouts
async with TopShouts.lock:
return TopShouts.shouts_by_rating[:limit]
@mutation.field("createShout")