django 缓存会话

5 投票
1 回答
4881 浏览
提问于 2025-04-16 13:47

我有两个问题:

1) 我想知道使用

django.contrib.sessions.backends.cache

来存储会话,真的能提高网站的性能吗?假设有大约25000个同时在线的用户,每个用户都在进行很多数据库的操作(比如浏览器游戏)。这样的改进能明显感觉到吗?

2) 再说一次,在使用缓存会话(不通过数据库)的情况下,怎么检查某个用户是否已经登录(不允许同一个账户多次登录)?

1 个回答

6

关于第一个问题:

根据我的经验,差别非常大。在你的情况中,每次创建或更改会话时,都会在数据库中写入数据。每当用户访问网站时,也会从数据库中读取数据。把这些操作移出数据库,可以为每个请求节省至少一次查询。

这种额外的流量,加上你正常的应用流量,可能会让你的数据库性能大幅下降。

关于第二个问题:

即使是使用数据库来管理会话,也没有明确的方法来确保用户只登录一次(读取所有会话数据、解码然后过滤并不是一个清晰的方法 :))。

为了做到这一点,我可能会使用缓存:每次用户登录时,检查缓存中是否有一个键(例如 user:<user_id>),存储的值将是会话ID。如果当前会话与存储的会话不同,就让旧会话失效,存储新的会话ID。

但即使这样也不总是有效,有时候浏览器的标签页/窗口会共享相同的cookie(特别是当SESSION_EXPIRE_AT_BROWSER_CLOSE设置为False时,这是默认设置),而会话完全依赖于cookie。

撰写回答