rails会话存储应该使用什么方法?怎么决定?

时间:2011-04-12 02:16:46

标签: mysql ruby-on-rails ruby session redis

在轨道上存储会话数据的最佳方法是什么?显然这取决于您的需求,但决定的关键因素是什么?不同场景的理想会话存储是什么?

2 个答案:

答案 0 :(得分:3)

安全应该是一个问题。请记住,可以使用浏览器代理修改存储在客户端的任何内容(例如cookie,表单POST参数,GET参数等)。因此,始终验证通过浏览器返回的任何内容。您可以加密cookie中的值或形成POST参数。此外,正如史蒂夫所提到的,cookie通常只能用于小值。

如果您不打算在服务器群集上运行,或者如果您在服务器发生故障时可以容忍用户会话丢失,那么基于默认文件的方法非常好(他们必须重新登录)。对于绝大多数应用程序,这是完全可以接受的。您需要为“粘性会话”配置负载均衡器,这意味着给定用户绑定到单个服务器。这可能会使负载平衡变得更加困难,因为您有时会发现许多用户绑定到一台服务器而另一台服务器闲置在那里。

如果您需要跨群集的共享会话状态,则有几个主要选项。如果您的流量不是极端,并且您可以处理一小段额外的延迟,那么您可以将会话信息存储在数据库中。只要数据库启动,会话数据就不会丢失。如果您的数据库已关闭,那么会话数据可能是您最不担心的问题。如果您的应用程序具有非常高的流量,或者性能非常高,那么最好的办法就是使用分布式缓存,例如memcached。但是,这是您必须维护和监控的额外“基础架构”。即使分发了memcached,它仍然是您添加到应用程序环境中的额外故障点。所以,如果你真的不需要它,不要掉以轻心。

总而言之,我认为基于默认文件的会话存储方法可能完全可以接受90%以上的应用程序。

答案 1 :(得分:2)

对于几乎所有情况,Cookie都是最好的。它们很简单,因为它们只依赖于服务器进程正在响应并且用户的浏览器像浏览器那样工作的事实。

Cookie不适合存储应该向用户隐藏的大量数据或数据,但这只是意味着您不应该将这些内容放在会话中。只要你记住这个限制,那通常不是问题。