【问题标题】:Does storing large sessions slow down response time and server存储大型会话是否会减慢响应时间和服务器
【发布时间】:2012-01-30 10:51:20
【问题描述】:

我正在为我的网站创建一个 Facebook 应用程序,其中包括需要用户朋友列表的功能。

找回好友没问题,我纠结的是如何存储。

  1. 选项 1 - 将用户存储在我的 MySQL 数据库中,我选择不这样做,因为我的数据库会很快变得非常沉重。此外,我需要为每个 Facebook 用户创建一个表!
  2. 选项 2 - 将 Facebook 好友数组存储在每半小时更新一次的会话中,以确保包含新朋友。 忽略会话每半小时更新一次的事实,在一个会话中存储一个非常大的数组是不是一个坏主意?

该网站可能会收到大量流量,因此会存储大量此类会话。

虽然我是一位经验丰富的开发人员,但我对这些情况下的会话并没有过多的经验。我只是想知道这是否是一个坏主意?

只是给你一些关于典型朋友数组的信息:

  1. 每个数组都是多维的,格式为 {0[uid:1,name:Jo Bloggs,picture:test.jpg],1...}
  2. 朋友列表的范围通常从 100 项到 5000 项,但平均约为 700 项。这些不小!

如果这是存储朋友的不好方法,还有哪些其他选项(不包括 MySQL)?

会话对内存 (RAM) 使用有影响吗?

【问题讨论】:

  • I will need to create a table for each individual Facebook user! - 你不需要这样做。如果你认为你这样做了,那么你计划的数据库架构就有缺陷。
  • 是的,会话对内存使用有影响,因为它们在运行/读取时可供 php 使用。我会使用 session_save_handler 将会话存储在数据库中。 (如果真的大量数据存储到会话中,您可以将数据拆分到另一个表中以保持“正常”会话访问和表小)。
  • 使用数据库,这就是它的用途。并且不要认为阵列不会变重。至于每个人的桌子,不是问题。这就是他们发明创建查询的原因。此外,您不必这样做。以多对多的方式存储它们,一切都会好起来的。
  • 感谢您的及时回复。 @DaveRandom,您是否只需将数组存储在长文本字段中?或者有一个朋友表,每个用户的每个朋友都有很多行?如果没有为每个用户提供一张桌子,我看不出有一种方法可以整齐地完成它。
  • 这取决于您需要如何访问数据。如果您需要使用(例如)“此人与此人是朋友”来查询数据库,那么您将有一个 friends 表和 users 表的 FK,因此您可以执行 SELECT * FROM friends WHERE user_id = '$userId',但是如果您只需要执行“获取所有这些人的朋友”类型的查询,您可以将所有数据存储在 1 个 BLOB 列中作为(例如)JSON。在有人问之前,我会使用 BLOB,因为它不受 65536 个字符的行长度限制。

标签: php mysql linux facebook session


【解决方案1】:

根据您的要求,我强烈建议在您的服务器上安装 MemCacheD。请参阅:http://memcached.org/ 了解更多信息。

会话仅适用于当前登录的用户,因此在会话之间共享信息会很困难。当会话消失时,用户数据也会消失。

对于 memcached,数据存储在键/值对中。

因此,对于键,您可以使用 facebook ID,对于值,可以使用用户数据的序列化对象。

【讨论】:

  • 看来 memcached 是用于“小块数据”的。我存储的数组非常大!这是个问题吗?
  • 我有兆字节数量级的对象。但是,您只是存储了从 API 获得的一些信息,因此您不必为已经加载过的项目浪费调用。假设 user1 有朋友 user2、user3、user4。而user5有朋友user2、user6。因此,当 user5 在 user1 之后进入您的应用程序时,您不必查询 API 以获取 user2 的信息,因为您从缓存中获取了它的副本。正确的?因此,您现在可以在每个用户对象中只存储朋友的 ID(而不是朋友的完全膨胀的用户对象数组)。
  • 不是那么简单,因为你在第一次登录时并不知道 X 和 Y 是不是朋友。此外,memcached 将这些数据存储在 RAM 中,这可能会适得其反,因为我目前正试图减少服务器上的 RAM 消耗。您的建议非常有帮助,但我认为它实际上并不相关,因为它只是加快查询速度,而不是以有效的方式存储用户朋友。
  • 你,我的朋友,从未使用过 memcached 的强大功能。它比您想象的要高效得多,除非您的编码员滥用它。您的编码人员必须构建您的对象以提高效率。 Memcached 与您传入的数据模型相关联。
  • 我不明白你是如何建议我存储朋友数组的。我是否应该将其存储在数据库中,然后“缓存”查询结果。或者我可以简单地将数组存储在 memcached 中吗?
猜你喜欢
  • 2011-11-24
  • 2012-09-04
  • 2023-03-29
  • 2021-08-05
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多