Django会话

38 投票
5 回答
12720 浏览
提问于 2025-04-11 09:27

我在研究Django中的会话功能,默认情况下,会话数据是存储在数据库里的。那么,使用文件系统和缓存来存储会话有什么好处呢?我应该在什么情况下使用它们呢?

5 个回答

10

从Django 1.1开始,你可以使用cached_db会话后端。

这个功能会把会话信息存储在缓存中(最好和memcached一起使用),然后再把它写回数据库。如果缓存中的信息过期了,就会从数据库中读取。

虽然这种方式比直接使用memcached存储会话要慢,但它能让会话信息更持久。

想了解更多信息,可以查看:Django文档:使用缓存会话

19

我不是Django的专家,所以下面的内容是关于会话存储的一般情况。如果我说错了,请给我点个踩。

性能和可扩展性

选择会话存储的方式会影响性能和可扩展性。如果你的应用非常受欢迎,这可能会成为一个大问题。

数据库和文件系统的会话存储通常都依赖于硬盘,这样你可以便宜地存储很多会话(因为硬盘便宜),但请求通常需要等数据读取(因为硬盘比较慢)。而Memcached会话使用的是内存,所以支持相同数量的并发会话会更贵(因为内存贵),但可能会更快(因为内存快)。

文件系统会话与运行你应用的服务器绑定在一起,所以如果你的网站变得非常大,就无法在多个应用服务器之间进行负载均衡。而数据库和Memcached会话允许多个应用服务器与一个共享的会话存储进行通信。

简单性

选择会话存储的方式也会影响你部署网站的难易程度。如果你选择不使用默认的存储方式,会增加一些复杂性。Memcached和关系型数据库管理系统(RDBMS)都有各自的复杂之处,但你的应用可能还是会使用RDBMS。

除非你有一个非常受欢迎的应用,否则简单性应该是更重要的考虑因素。

额外信息

另一种方法是将会话数据存储在cookies中(全部数据,而不仅仅是一个ID)。这样做的好处是会话存储会随着用户数量自动扩展,但也有缺点。你(或者你的框架)需要小心防止用户伪造会话数据。同时,你还需要保持每个会话的数据量小,因为每次请求都会发送整个会话数据。

25

如果你的系统里不打算用数据库,那么文件系统的后端可以考虑一下。但如果你已经在用数据库,那文件系统的后端就没什么好推荐的了。

相比数据库后端,内存缓存的速度要快很多,但这样做有个风险,就是可能会把会话数据清除掉,导致你的一些会话信息丢失。

如果你的网站流量非常大,并且代码写得很仔细,能接受丢失一些会话数据,那就可以用内存缓存。如果不使用数据库的话,可以考虑文件系统缓存,但在大多数情况下,默认的数据库后端是最好的、最安全的,也是最简单的选择。

撰写回答