You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django框架下如何获取memcached存储的所有会话并实现手动管理

Django Memcached 会话管理实现方案

前置说明

Memcached 本身未提供高性能的全量键遍历能力,直接使用keys *命令会遍历所有存储条目,导致实例阻塞影响线上业务。下述方案中小规模站点/测试环境可直接使用,大规模生产环境建议额外维护会话索引库避免直接扫描Memcached。

1. 确认基础配置

首先确认项目settings.py中的相关配置,后续键前缀构造需要和配置对齐:

# settings.py 参考配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': '127.0.0.1:11211',
        'KEY_PREFIX': 'myproject', # 无配置则填空字符串
        'VERSION': 1, # 未手动修改则默认是1
    }
}

2. 获取所有会话实现

基于Django原生的SessionStore和Memcached的scan迭代能力实现全量会话读取:

from django.conf import settings
from django.contrib.sessions.backends.cache import SessionStore
from django.core.cache import cache

# 构造会话键前缀,和Django缓存生成规则对齐
SESSION_KEY_PREFIX = f"{settings.CACHES['default']['KEY_PREFIX']}:{settings.CACHES['default']['VERSION']}:django.contrib.sessions.cache"

def get_all_sessions():
    session_list = []
    # 获取Memcached原生客户端实例
    memcached_client = cache._cache
    
    # 迭代所有符合规则的会话键,不会阻塞实例
    for raw_key in memcached_client.scan_iter(f"{SESSION_KEY_PREFIX}*"):
        # 提取纯session key
        session_key = raw_key.decode().split(SESSION_KEY_PREFIX)[1]
        session = SessionStore(session_key=session_key)
        
        # 过滤已过期的无效会话
        if session.exists(session_key):
            session_list.append({
                "session_key": session_key,
                "user_id": session.get("_auth_user_id"),
                "expire_at": session.get_expiry_date(),
                "raw_data": session.load()
            })
    return session_list

如果你使用旧版python-memcached驱动没有scan_iter方法,仅测试环境可替换为memcached_client.keys(f"{SESSION_KEY_PREFIX}*")获取键,禁止在生产环境使用该写法。

3. 删除指定会话实现

Django原生提供了会话删除的封装,直接调用即可:

def delete_target_session(session_key: str) -> bool:
    session = SessionStore(session_key=session_key)
    session.delete()
    return True

4. 集成到Web界面

你可以按照常规Django视图逻辑开发管理页面:

  • 开发查询视图,调用get_all_sessions()获取会话列表,传入模板渲染成表格展示
  • 开发删除视图,接收前端传来的session_key参数,调用delete_target_session()执行删除
  • 给管理页面加管理员权限校验,避免未授权访问泄露会话数据

注意事项

  • 会话量级超过1万的生产环境不建议直接扫描Memcached,可在用户登录/登出时同步将会话的关键信息(session_key、用户ID、过期时间)写入数据库,管理后台直接查询数据库即可,不需要操作Memcached
  • 不要将会话的完整原始数据暴露给前端,避免敏感信息泄露

内容的提问来源于stack exchange,提问作者Mislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:24:04