Django会话

时间:2020-03-05 18:49:37  来源:igfitidea点击:

我正在看Django中的会话,默认情况下它们存储在数据库中。文件系统和缓存会话有什么好处,何时应使用它们?

解决方案

回答

仅当我们不打算将数据库用于系统的任何其他部分时,才值得看一下文件系统后端。如果我们使用的是数据库,则文件系统后端没有什么可推荐的。

内存缓存后端比数据库后端要快得多,但是我们冒着清除会话和丢失某些会话数据的风险。

如果我们是一个流量非常高的网站,请仔细编写代码,以便应对丢失的会话,然后使用内存缓存。如果我们不使用数据库,请使用文件系统缓存,但是在几乎所有情况下,默认数据库后端都是最好,最安全和最简单的选项。

回答

我不是Django专家,所以这个答案通常是关于会话存储的。如果我错了,请投降。

性能和可伸缩性

会话存储的选择会影响性能和可伸缩性。仅当我们拥有非常流行的应用程序时,这才是一个大问题。

数据库和文件系统会话存储区(通常)都由磁盘支持,因此我们可以廉价地拥有许多会话(因为磁盘很便宜),但是请求通常必须等待数据被读取(因为磁盘很慢)。 Memcached会话使用RAM,因此支持相同数量的并发会话会花费更多(因为RAM昂贵),但可能会更快(因为RAM很快)。

文件系统会话绑定到应用程序运行所在的框,因此,如果站点很大,则无法在多个应用程序服务器之间进行负载平衡。数据库会话和内存缓存会话使我们可以让多个应用程序服务器与共享会话存储进行对话。

简单

会话存储的选择还将影响部署网站的难易程度。更改为默认值将花费一些复杂性。 Memcached和RDBMS都有各自的复杂性,但是应用程序可能仍将使用RDBMS。

除非我们有非常受欢迎的应用程序,否则简单性应该是更大的关注点。

奖金

另一种方法是将会话数据存储在Cookie中(所有数据,而不仅仅是ID)。这样做的好处是会话存储会根据用户数量自动扩展,但是也有缺点。我们(或者框架)需要小心,以阻止用户伪造会话数据。我们还需要使每个会话保持较小,因为整个过程将随每个请求一起发送。

回答

选择会话后端时必须考虑的一件事是"会话数据被修改的频率"?如果每次请求都修改会话数据,那么即使流量适中的站点也将遭受损失,从而需要进行许多数据库行程来存储和检索数据。

在我之前的工作中,我们仅将memcache用作会话后端,并且效果很好。我们的管理团队非常努力地使两个特殊的Memcached实例稳定如磐石,但是在与初始设置进行了些许改动之后,我们没有中断任何会话后端操作。

回答

如果数据库的DBA不是我们本人,则可能不允许我们使用数据库支持的会话(这仅是前端问题)。在django支持轻松合并来自多个数据库的数据之前,我们可以将特定于前端的内容(例如会话和用户消息)(django.contrib.auth中的消息也存储在数据库中)保存在单独的数据库中,这一点。

回答

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

这会将会话存储在缓存中(仅与memcached一起使用),并将其写回到数据库中。如果它已从缓存中掉出来,将从数据库中读取它。

尽管这比仅使用memcached来存储会话要慢,但它会增加会话的持久性。

有关更多信息,请参见:Django Docs:使用缓存的会话