我正在查看 Django 中的会话,默认情况下它们存储在数据库中。文件系统和缓存会话有什么好处,我应该什么时候使用它们?
5 回答
如果您不打算将数据库用于系统的任何其他部分,文件系统后端才值得一看。如果您使用的是数据库,那么文件系统后端没有什么可推荐的。
memcache 后端比数据库后端快得多,但是您会冒着会话被清除和一些会话数据丢失的风险。
如果您是一个非常非常高流量的网站并且仔细编码以便您可以应对丢失会话,那么请使用 memcache。如果您不使用数据库,请使用文件系统缓存,但默认数据库后端几乎在所有情况下都是最好、最安全和最简单的选项。
我不是 Django 专家,所以这个答案通常是关于会话存储的。如果我错了,请投反对票。
性能和可扩展性
会话存储的选择对性能和可伸缩性有影响。如果您有一个非常受欢迎的应用程序,这应该只是一个大问题。
数据库和文件系统会话存储(通常)都由磁盘支持,因此您可以廉价地拥有大量会话(因为磁盘很便宜),但请求通常必须等待数据被读取(因为磁盘很慢)。Memcached 会话使用 RAM,因此支持相同数量的并发会话将花费更多(因为 RAM 很昂贵),但可能更快(因为 RAM 很快)。
文件系统会话与您的应用程序运行所在的机器相关联,因此如果您的站点变得庞大,您将无法在多个应用程序服务器之间进行负载平衡。数据库和 memcached 会话让您有多个应用程序服务器与共享会话存储进行通信。
简单
会话存储的选择也会影响部署站点的难易程度。改变默认设置会花费一些复杂性。Memcached 和 RDBMS 都有自己的复杂性,但您的应用程序可能无论如何都将使用 RDBMS。
除非您有一个非常流行的应用程序,否则简单性应该是更大的关注点。
奖金
另一种方法是将会话数据存储在 cookie 中(所有这些,而不仅仅是一个 ID)。这样做的好处是会话存储会随着用户数量自动扩展,但也有缺点。您(或您的框架)需要小心阻止用户伪造会话数据。您还需要使每个会话保持较小,因为整个内容将随每个请求一起发送。
从 Django 1.1 开始,您可以使用 cached_db 会话后端。
这会将会话存储在缓存中(仅与 memcached 一起使用),并将其写回数据库。如果它已经从缓存中掉出来,它将从数据库中读取。
虽然这比使用 memcached 存储会话要慢,但它增加了会话的持久性。
有关更多信息,请参阅:Django 文档:使用缓存会话
One thing that has to be considered when choosing session backend is "how often session data is modified"? Even sites with moderate traffic will suffer if session data is modified on each request, making many database trips to store and retrieve data.
In my previous work we used memcache as session backend exclusively and it worked really well. Our administrative team put really great effort in making two special memcached instances stable as a rock, but after bit of twiddling with initial setup, we did not have any interrupts of session backends operations.
如果数据库的 DBA 不是您,则可能不允许您使用数据库支持的会话(这只是前端问题)。直到 django 支持轻松合并来自多个数据库的数据,以便您可以在单独的数据库中拥有特定于前端的内容,例如会话和用户消息(django.contrib.auth 中的消息也存储在数据库中),您需要保留记住这一点。