在rails上存储会话数据的最佳方法是什么?显然这取决于您的需求,但决定的关键因素是什么?对于不同的场景,理想的会话存储是什么?应该使用什么方法来存储轨道会话?如何决定?
回答
对于几乎所有情况,饼干都是最好的。它们很简单,因为它们只依赖于服务器进程正在响应以及用户的浏览器像浏览器一样工作的事实。
Cookie不适合存储大量的数据或数据,这些数据或数据应该从用户隐藏,但这意味着您不应该将这些内容放在会话中。这通常不是问题,只要你牢记这个限制。
安全性应该是一个问题。请记住,可以使用浏览器代理修改存储在客户端的任何内容(如cookie,表单POST参数,GET参数等)。因此,始终验证通过浏览器返回的任何内容。您可以加密cookie中的值或形成POST参数。另外,正如史蒂夫所说,Cookie通常只应用于小数值。
如果你不打算在服务器集群上运行,或者如果你是,如果你可以忍受用户的会话在服务器关闭时丢失的话,那么默认的基于文件的方法是非常好的重新登录)。对于绝大多数应用程序,这是完全可以接受的。您需要将负载均衡器配置为“粘性会话”,这意味着给定用户绑定到单个服务器。但是,这可能会使负载平衡变得更加困难,因为您有时会发现许多用户都绑定到一台服务器,而另一台服务器却处于空闲状态。
如果您需要跨集群共享会话状态,那么您有几个主要选项。如果你的流量不是极端的,你可以处理一点额外的延迟,那么你可以将会话信息存储在数据库中。只要数据库启动,会话数据就不会丢失。如果数据库关闭,那么会话数据可能是您最担心的问题。如果您的应用具有非常高的流量,或者令人难以置信的性能至关重要,那么您最好的办法就是使用分布式缓存,例如memcached。然而,这是额外的“基础设施”,你将不得不维护和监视。即使memcached已经发布,它仍然是您添加到应用程序环境的额外失败点。所以,如果你不需要它,不要轻视它。为了长话短说,我假设基于默认文件的会话存储方法对于90%以上的应用程序来说可能是完全可以接受的。
我们已经在使用db store,并且担心增加的延迟 - 似乎要求100ms左右的请求...... memcache可能会失败,但我不想强制登录。由于Redis可以定期写入光盘,因此redis看起来稍微好一点 - 但是我没有使用redis的经验,也不确定它是否将缓存和会话存储中的memcache替换为它。 “原来的问题比原来的问题更广泛,但它存在于...” – chrishomer 2011-04-12 04:56:19
“为了防止会话哈希被篡改,摘要会从具有服务器端秘密的会话中计算出来并插入cookie的末尾。 guides.rubyonrails.org/security.html。 – 2011-04-12 05:13:34
100ms看起来过多。你有没有在数据库中调整会话存储?会话信息的读/写比率是多少?您可以在每次写入时持久化数据库,但在memcached中缓存,如果存在,则不查询数据库,而只是直接从缓存中查询。如果会话在缓存中不存在(因为可能服务器已经死掉),请查询数据库以填充缓存。只要服务器保持活动状态,就可以使用粘性会话,因此通常会话信息位于特定服务器上。 – squawknull 2011-04-13 01:04:59
- 1. nodejs。什么库我应该使用会话存储在MongoDB中
- 2. 什么是建议的方法来存储会话ID
- 3. 存储会话中轨API应用
- 4. 为商务应用程序快速存储会话我应该使用什么?
- 5. 决定什么方法/函数应该/不应该做
- 6. 如何在轨道会话中存储不分明的对象?
- 7. 我应该使用什么方法来存储许多类别的数据?
- 8. 应该使用什么方法将模型绑定到现有会话对象?
- 9. 什么叫会话存储?
- 10. 什么数据应该存储在会话变量中Laravel 5
- 11. 如何在java中使用某种方法来知道该方法应该做什么?
- 12. 无论指定什么,使用GET方法的轨道形式
- 13. 我应该使用什么来存储多个图像?
- 14. 我应该使用什么结构来存储这些对象?
- 15. 使用会话来存储数据表
- 16. 使用Amazon ElastiCache redis来存储会话
- 17. 不知道如何存储会话ID在SQL会话状态
- 18. 如何解决在轨道中Searchkick未定义的方法`paginate'?
- 19. 通过secure_cookie使用Tornado存储“会话”数据的首选方法是什么?
- 20. 应该使用什么方法?
- 21. 无法知道如何使用会话
- 22. 如何使用PHP存储会话
- 23. 我应该如何在webapp2会话中存储实体密钥?
- 24. 我应该如何在node.js上实现会话存储
- 25. 我应该使用什么方法在手机上存储文字和图片?
- 26. 我应该使用什么方法来制作我的Java GUI?
- 27. 什么时候应该使用方法来返回值?
- 28. 使用oAuth登录,我应该存储/使用什么来识别用户?
- 29. 我应该通过什么参数来调用该方法C#
- 30. 在会话中存储数组?我应该怎么做?
Cookie的问题是高级用户更改值的能力。还有每个请求来回发送数据,这似乎是过度杀伤。宁愿发送一个键来查找数据。 – chrishomer 2011-04-12 05:00:23
@ChrisH - “为了防止会话哈希被篡改,摘要会根据会话与服务器端秘密进行计算并插入cookie的末尾。” http://guides.rubyonrails.org/security.html。由于会话数据应该保持较小,所以来回发送不成问题。此外,cookie只在服务器发生更改时才会发送。 – 2011-04-12 05:12:17