perf: 优化user session 逻辑

pull/12804/head
feng 2024-03-12 19:33:26 +08:00 committed by Bryan
parent e5cb99d682
commit cfb1d306a3
4 changed files with 16 additions and 11 deletions

View File

@ -269,7 +269,7 @@ class UserSessionViewSet(CommonApiMixin, viewsets.ModelViewSet):
return user_ids
def get_queryset(self):
keys = UserSession.get_keys()
keys = user_session_manager.get_keys()
queryset = UserSession.objects.filter(key__in=keys)
if current_org.is_root():
return queryset

View File

@ -288,16 +288,9 @@ class UserSession(models.Model):
ttl = caches[settings.SESSION_CACHE_ALIAS].ttl(cache_key)
return timezone.now() + timedelta(seconds=ttl)
@staticmethod
def get_keys():
session_store_cls = import_module(settings.SESSION_ENGINE).SessionStore
cache_key_prefix = session_store_cls.cache_key_prefix
keys = caches[settings.SESSION_CACHE_ALIAS].iter_keys('*')
return [k.replace(cache_key_prefix, '') for k in keys]
@classmethod
def clear_expired_sessions(cls):
keys = cls.get_keys()
keys = user_session_manager.get_keys()
cls.objects.exclude(key__in=keys).delete()
class Meta:

View File

@ -37,6 +37,9 @@ class RedisUserSessionManager:
if new_count <= 0:
self.client.hdel(self.JMS_SESSION_KEY, session_key)
def remove(self, session_key):
self.client.hdel(self.JMS_SESSION_KEY, session_key)
def check_active(self, session_key):
count = self.client.hget(self.JMS_SESSION_KEY, session_key)
count = 0 if count is None else int(count.decode('utf-8'))
@ -52,5 +55,12 @@ class RedisUserSessionManager:
session_keys.append(key)
return session_keys
def get_keys(self):
session_keys = []
for k in self.client.hgetall(self.JMS_SESSION_KEY).keys():
key = k.decode('utf-8')
session_keys.append(key)
return session_keys
user_session_manager = RedisUserSessionManager()

View File

@ -13,8 +13,9 @@ from audits.models import UserSession
from authentication.backends.oauth2.signals import oauth2_create_or_update_user
from authentication.backends.oidc.signals import openid_create_or_update_user
from authentication.backends.saml2.signals import saml2_create_or_update_user
from common.const.crontab import CRONTAB_AT_PM_TWO
from common.const.crontab import CRONTAB_AT_AM_TWO
from common.decorators import on_transaction_commit
from common.sessions.cache import user_session_manager
from common.utils import get_logger
from jumpserver.utils import get_current_request
from ops.celery.decorator import register_as_period_task
@ -164,7 +165,7 @@ def on_openid_create_or_update_user(sender, request, user, created, name, userna
@shared_task(verbose_name=_('Clean up expired user sessions'))
@register_as_period_task(crontab=CRONTAB_AT_PM_TWO)
@register_as_period_task(crontab=CRONTAB_AT_AM_TWO)
def clean_expired_user_session_period():
UserSession.clear_expired_sessions()
@ -172,4 +173,5 @@ def clean_expired_user_session_period():
@receiver(user_logged_out)
def user_logged_out_callback(sender, request, user, **kwargs):
session_key = request.session.session_key
user_session_manager.remove(session_key)
UserSession.objects.filter(key=session_key).delete()