会话 VS 文件 VS Memcache 用于 PHP 中的缓存?

Posted

技术标签:

【中文标题】会话 VS 文件 VS Memcache 用于 PHP 中的缓存?【英文标题】:Session VS File VS Memcache for a Cache in PHP? 【发布时间】:2010-11-14 22:24:49 【问题描述】:

我有一个社交网络

users 表大约有 60,000 行

friends 表在 100 万左右 行(用于确定谁是您的 朋友)

我想做一个朋友提要,墙,无论你喜欢怎么称呼它,它都会显示用户状态帖子(twitter 类型的帖子)之类的东西,它会显示一些不同的项目,但一开始它只是朋友状态,也许还有博客文章。

基本上,您只会看到使用您朋友列表中的用户 ID 发布的内容。

我一直在努力想出最好的方法,但还没有走多远,但这是我的最新想法。

目前要构建这个提要,我必须

    获取好友ID列表 大朋友桌

    从好友那里获取流数据 以上结果中的ids

    加入用户表以获取 发布者图片 URL 和用户名

    然后加入 cmets 表得到 cmets 发布在 Feed 项上

构建该提要是一项艰巨的任务

到目前为止,我有 3 个想法,这就是您可以提供帮助的地方。

内存缓存选项:

    使用 memcache 缓存用户 当用户的朋友列表作为一个数组 登录网站,当用户 批准一个新的好友请求 要添加到那里的朋友,它 将在那里重建缓存。 除了获取朋友之外,我还可以在那里保存朋友的图片 URL 和用户名,这将通过在构建朋友提要时消除此查询来再次加快速度。

文件缓存选项:

    执行与 memcache 选项相同的操作 只是将此数据保存为数组 到缓存文件而不是内存, 然后将此缓存文件包含到 页面。

    我不确定哪个是最好的 我理解的表现方法 memcache 将所有内容存储在内存中 所以拥有20,000的朋友 可以使用很多的朋友 内存和文件缓存只会 当用户将其放入内存中 如果我是正确的,需要它。另外如果我 做了文件方法,当用户 退出网站,我会删除 有缓存文件所以缓存文件夹 文件永远不会太大

会话缓存选项:

    和上面的文件缓存一样,我刚刚意识到会话数据被保存到一个文件中,那不就让它成为一个缓存吗?

请给我您对此的意见或任何建议或信息,因为我对缓存知之甚少,我读过很多书,但有时其他人的想法很有帮助

【问题讨论】:

“会话数据保存到文件中”。你上面的说法是错误的。会话可以配置为存储在数据库中。默认会话处理程序是文件。 【参考方案1】:

Memcache 是您最好的选择,原因有很多:

    速度非常快 - 一切都在内存中,并且针对像您这样的情况进行了高度优化(以及一般的缓存:) 它是分布式的 - 这意味着如果您有多个 Web / 应用服务器在运行,它们都可以访问同一个缓存 您可以为 memcache 汇集多个服务器 - 如果您有一些相对未充分利用的服务器(或多个专用缓存服务器),您可以将它们全部汇集到一个大缓存中 它具有超强的可扩展性(出于前面提到的原因) 它有很好的 php 支持 - 用于 memcache 的 PECL 包最近更新了很多新的优点 您甚至可以将您的用户会话存储在内存缓存中 - 只需在您的 php.ini 文件中进行设置。这比将会话存储在数据库中要快得多,并且允许您的会话在多个 Web 主机上持续存在(如果您处于负载平衡的情况下)......这也将使您的网站性能有所提升,因为不需要访问文件系统/数据库以获取每个请求的会话信息。

...还有更多;)

关于您对单个缓存项目的内存占用的一些担忧,您有几个选择。我最初的想法是试一试,看看这些缓存项到底有多大(你可以找到几个开源的东西来监控实际的缓存使用情况,比如 cacti)。我认为它们会比您想象的要小。

如果不是,我建议您根据实际缓存的内容、多长时间等重新考虑您的缓存策略。也许您可以从缓存中已经存在的几个内容构建提要(即缓存个人用户数据,然后从缓存中的所有这些单个项目为一个人构建提要)。在这方面有很多好文章,只需搜索它们即可:)

【讨论】:

感谢您的帖子提供了非常丰富的信息,当您提到 cacti 用于测量 ram 使用时,您是指一般测量它还是在使用 memcache 时测量它?谢谢 实际上有一个 cacti 插件用于监控 memcache 本身...会给你命中/未命中、num 项目等。 感谢我迫不及待地想尝试 memcache,而且我刚刚发现 facebook 将人们限制为 5,000 个朋友,所以我想我也会这样做,这将比任何事情都更有帮助! 【参考方案2】:

Memcache 中允许的默认最大对象大小为 1MB。

@jsaondavis: “会话数据保存到文件中”。

你上面的说法是错误的。会话可以配置为存储在数据库中。默认会话处理程序是文件。

【讨论】:

【参考方案3】:

Redis 将是一个很好的解决方案:

这是关于 Redis Vs 的一个帖子。内存缓存。 听起来 Redis 有 512mb 的存储空间,而不是 1mb 的限制......有点不同:)

Memcached vs. Redis?

【讨论】:

【参考方案4】:

错了! Memcached 的大小不固定!这取决于您设置的计算机内存和配置。

【讨论】:

以上是关于会话 VS 文件 VS Memcache 用于 PHP 中的缓存?的主要内容,如果未能解决你的问题,请参考以下文章

evcache vs redis

如何使用会话状态模式:带有 VS2010 的 SQL Server

memcache

Cookies vs 会话 vs 数据库 [关闭]

VS代码中用于切换侧边栏可见性和快速打开的Intellij的快捷方式

“未定义变量:_SESSION”VS。 “会话已经开始”