Cache prefetch
This commit is contained in:
parent
c2f6dba462
commit
2831a24b90
6 changed files with 70 additions and 34 deletions
|
@ -25,26 +25,18 @@ class Room(models.Model):
|
|||
class Meta:
|
||||
app_label = "chat_box"
|
||||
|
||||
@cache_wrapper(prefix="Rinfo")
|
||||
def _info(self):
|
||||
last_msg = self.message_set.filter(hidden=False).first()
|
||||
return {
|
||||
"user_ids": [self.user_one.id, self.user_two.id],
|
||||
"last_message": last_msg.body if last_msg else None,
|
||||
}
|
||||
|
||||
@cached_property
|
||||
def _cached_info(self):
|
||||
return self._info()
|
||||
return get_room_info(self.id)
|
||||
|
||||
def contain(self, profile):
|
||||
return profile.id in self._cached_info["user_ids"]
|
||||
return profile.id in [self.user_one_id, self.user_two_id]
|
||||
|
||||
def other_user(self, profile):
|
||||
return self.user_one if profile == self.user_two else self.user_two
|
||||
|
||||
def other_user_id(self, profile):
|
||||
user_ids = self._cached_info["user_ids"]
|
||||
user_ids = [self.user_one_id, self.user_two_id]
|
||||
return sum(user_ids) - profile.id
|
||||
|
||||
def users(self):
|
||||
|
@ -53,6 +45,10 @@ class Room(models.Model):
|
|||
def last_message_body(self):
|
||||
return self._cached_info["last_message"]
|
||||
|
||||
@classmethod
|
||||
def prefetch_room_cache(self, room_ids):
|
||||
get_room_info.prefetch_multi([(i,) for i in room_ids])
|
||||
|
||||
|
||||
class Message(models.Model):
|
||||
author = models.ForeignKey(Profile, verbose_name=_("user"), on_delete=CASCADE)
|
||||
|
@ -147,3 +143,11 @@ class Ignore(models.Model):
|
|||
self.remove_ignore(current_user, friend)
|
||||
else:
|
||||
self.add_ignore(current_user, friend)
|
||||
|
||||
|
||||
@cache_wrapper(prefix="Rinfo")
|
||||
def get_room_info(room_id):
|
||||
last_msg = Message.objects.filter(room_id=room_id).first()
|
||||
return {
|
||||
"last_message": last_msg.body if last_msg else None,
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ from judge import event_poster as event
|
|||
from judge.jinja2.gravatar import gravatar
|
||||
from judge.models import Friend
|
||||
|
||||
from chat_box.models import Message, Profile, Room, UserRoom, Ignore
|
||||
from chat_box.models import Message, Profile, Room, UserRoom, Ignore, get_room_info
|
||||
from chat_box.utils import encrypt_url, decrypt_url, encrypt_channel, get_unread_boxes
|
||||
|
||||
|
||||
|
@ -231,7 +231,7 @@ def post_message(request):
|
|||
},
|
||||
)
|
||||
else:
|
||||
Room._info.dirty(room)
|
||||
get_room_info.dirty(room.id)
|
||||
room.last_msg_time = new_message.time
|
||||
room.save()
|
||||
|
||||
|
@ -363,6 +363,8 @@ def user_online_status_ajax(request):
|
|||
def get_online_status(profile, other_profile_ids, rooms=None):
|
||||
if not other_profile_ids:
|
||||
return None
|
||||
Profile.prefetch_profile_cache(other_profile_ids)
|
||||
|
||||
joined_ids = ",".join([str(id) for id in other_profile_ids])
|
||||
other_profiles = Profile.objects.raw(
|
||||
f"SELECT * from judge_profile where id in ({joined_ids}) order by field(id,{joined_ids})"
|
||||
|
@ -429,6 +431,7 @@ def get_status_context(profile, include_ignored=False):
|
|||
|
||||
recent_profile_ids = [str(i["other_user"]) for i in recent_profile]
|
||||
recent_rooms = [int(i["id"]) for i in recent_profile]
|
||||
Room.prefetch_room_cache(recent_rooms)
|
||||
|
||||
admin_list = (
|
||||
queryset.filter(display_rank="admin")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue