增加比赛结果缓存

This commit is contained in:
virusdefender 2015-09-27 20:41:56 +08:00
parent 634bc82024
commit 67de24a5b3
2 changed files with 22 additions and 8 deletions

View File

@ -1,6 +1,7 @@
# coding=utf-8 # coding=utf-8
import json import json
import datetime import datetime
import redis
from django.shortcuts import render from django.shortcuts import render
from django.db import IntegrityError from django.db import IntegrityError
@ -8,6 +9,7 @@ from django.utils import dateparse
from django.db.models import Q, Sum from django.db.models import Q, Sum
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.utils.timezone import now from django.utils.timezone import now
from django.conf import settings
from rest_framework.views import APIView from rest_framework.views import APIView
@ -383,8 +385,19 @@ def contest_list_page(request, page=1):
@check_user_contest_permission @check_user_contest_permission
def contest_rank_page(request, contest_id): def contest_rank_page(request, contest_id):
contest = Contest.objects.get(id=contest_id) contest = Contest.objects.get(id=contest_id)
contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index")[:20] contest_problems = ContestProblem.objects.filter(contest=contest).order_by("sort_index")
rank = ContestRank.objects.filter(contest_id=contest_id).select_related("user").order_by("-total_ac_number", "total_time") r = redis.Redis(host=settings.REDIS_CACHE["host"], port=settings.REDIS_CACHE["port"], db=settings.REDIS_CACHE["db"])
cache_key = str(contest_id) + "_rank_cache"
rank = r.get(cache_key)
if not rank:
rank = ContestRank.objects.filter(contest_id=contest_id).\
select_related("user").\
order_by("-total_ac_number", "total_time").\
values("id", "user__id", "user__username", "user__real_name", "contest_id", "submission_info",
"total_submission_number", "total_ac_number", "total_time")
r.set(cache_key, json.dumps([dict(item) for item in rank]))
else:
rank = json.loads(rank)
return render(request, "oj/contest/contest_rank.html", return render(request, "oj/contest/contest_rank.html",
{"rank": rank, "contest": contest, {"rank": rank, "contest": contest,
"contest_problems": contest_problems, "contest_problems": contest_problems,

View File

@ -1,6 +1,5 @@
# coding=utf-8 # coding=utf-8
import datetime import json
from django.utils.timezone import now
def get_contest_status(contest): def get_contest_status(contest):
@ -34,10 +33,11 @@ def get_the_formatted_time(seconds):
def get_submission_class(rank, problem): def get_submission_class(rank, problem):
if str(problem.id) not in rank.submission_info: submission_info = json.loads(rank["submission_info"])
if str(problem.id) not in submission_info:
return "" return ""
else: else:
submission = rank.submission_info[str(problem.id)] submission = submission_info[str(problem.id)]
if submission["is_ac"]: if submission["is_ac"]:
_class = "alert-success" _class = "alert-success"
if submission["is_first_ac"]: if submission["is_first_ac"]:
@ -48,10 +48,11 @@ def get_submission_class(rank, problem):
def get_submission_content(rank, problem): def get_submission_content(rank, problem):
if str(problem.id) not in rank.submission_info: submission_info = json.loads(rank["submission_info"])
if str(problem.id) not in submission_info:
return "" return ""
else: else:
submission = rank.submission_info[str(problem.id)] submission = submission_info[str(problem.id)]
if submission["is_ac"]: if submission["is_ac"]:
r = get_the_formatted_time(submission["ac_time"]) r = get_the_formatted_time(submission["ac_time"])
if submission["error_number"]: if submission["error_number"]: