Rails中的大型会话 - 不存储在本地数据库中

时间:2012-06-25 15:59:26

标签: ruby-on-rails ruby session

我正在制作一个有点大的轨道应用程序,用户填写多个表格,并作为回报引用汽车保险。引用引擎都是外部的,以及外部数据库。

我不需要在mysql或类似的DB长期存储会话。

存储这些会话的最佳方式是什么。

CookieStore既不安全又有限(<4kb cookie)。

Memchached是可能的,除了我不喜欢key =&gt;的想法值对,我想尽可能多的关联数组。

任何与数据库相关的会话存储都是多余的(?)

某种文件存储系统可能是要走的路?

请问有人可以提供有关存储会议的最佳方式的建议吗?

2 个答案:

答案 0 :(得分:1)

我不明白为什么数据库无法处理这个问题。

我建议使用数据库在处理数据时存储数据,并在非工作时间内删除Cron job旧记录。

如果涉及 money transactions 或其他类型的数据库事务需要以ACID方式处理您的数据,则应使用像 PostgreSQL 或类似的数据库。

如果不是这种情况,并且您只是想快速存储一些数据,那么为什么不使用NoSQL之类的 MongoDB 解决方案?

此外,作为警告,如果您决定使用文件系统来存储数据,最终可能会出现数据存储在一台服务器上的扩展问题,但请求由另一台服务器处理。 / em>的

答案 1 :(得分:1)

Memcache或数据库存储是可行的方法。在这两种情况下,随着您的网站扩展,您的许多服务器将能够获取/设置会话数据。

我过去曾经使用过这两种方法,你应该知道一些事情:

1)两者都可以存储任意数据

Rails会话被视为Hash,并且存储的值是该Hash的序列化版本。在Memcache中,key =&gt;值对是session_id =&gt; session_contents。在数据库存储中,您有两列,一列用于id,另一列用于内容。

2)Memcache快一点

每一点速度都有帮助;为此,Memcache将比数据库更快。

3)Memcache倾向于在密钥满了时删除密钥

如果您的Memcache实例开始内存不足,则会开始删除密钥。它通过先丢弃最老的那个来做到这一点。由于会话被主动使用,您可以通过在每个请求上勾选会话数据来缓解这种情况;这使他们处于最佳状态。但是如果你的实例真的满了,你可能会开始在场上放弃会话并将用户注销。这通常只是在增长非常迅速的情况下才会出现的问题,例如,如果你遇到了斜线问题。否则,您可以轻松地关注Memcache服务器并确保您的存储空间不足。

4)数据库表将迅速填满过期的会话    Memcache自动丢弃旧东西。当用户没有注销但只是放弃会话时,您必须在数据库中手动进行清理。通常,最好使用每日cron作业。如果没有,你最终会得到一个无数的陈旧记录,这会减慢对该表的查询速度。

哪种方式最适合你?我不知道。这取决于您的情况,以及您愿意承担的风险类型。我从来没有使用memcache丢弃会话问题,但这实际上取决于你使用memcache的其他内容。如果你经常使用它,那么第二个memcache实例只是用于会话可能是要走的路。然后没有丢掉他们的风险。