PHP: tmpfs vs memcached

5
我想在RAM中存储信息(会话和大量字符串),但我不知道应该使用tmpfs还是memcached服务器。有人进行了一些基准测试,知道哪一个更快吗?这是为一些ajax脚本所需的,每个已登录用户每1-5秒请求信息,就像PHP中的Web聊天。因此,PHP必须经常连接到memcache。

使用tmpfs的优点是我可以创建许多文件并拥有结构(目录),而在memcached中我只有一个键值系统,但我可以使用数组或对象来存储信息。如果有任何差异,CPU负载也很有趣。

谢谢。

5个回答

5

以下是需要翻译的内容:

  1. tmpfs或ramdisk比memcached更成熟(它们存在的时间更长,但两者都很稳定)。
  2. tmpfs是可扩展的(您可以根据需要调整大小或增加大小,而不会丢失tmpfs的内容)。
  3. 如果您需要在另一台机器上使用内存或需要在多台机器之间共享信息,则memcached非常适合。
  4. 本地文件/套接字/管道性能始终优于网络套接字,并且访问tmpfs中的文件与访问任何其他文件相同,因此不需要任何第三方库。

如果您不希望数据超出服务器内存,请使用tmpfs。

如果必须在服务器之间共享数据或想要存储更多数据以适应本地服务器RAM,则请使用memcached。


2

我对速度不是很了解,但以下是关于memcached需要考虑的几个问题:

  • memcached基于集群架构:您可以添加任意数量的物理服务器,在其上安装memcached守护程序,从而在集群中获得更多内存。
    • 这意味着使用memcached可以缓存的数据量几乎没有限制:如果需要更多内存,只需添加几台服务器即可。
    • 另一方面,使用tmpfs时,您受到每个服务器可用RAM量的限制。
  • memcached是一种缓存机制;它不是用来存储数据的;这意味着:
    • 当没有足够的内存来存储新项时,旧项将从缓存中删除。
    • 每个项都有一个生命周期;当过期时,该项将从缓存中删除。
  • memcached是共享的:您可以有多个PHP服务器访问单个memcached集群
  • 有许多现有的基于memcached的库,或者是为了访问memcached而创建的库
    • 包括一些用于PHP的会话机制
    • 以及几个缓存库
  • 无论是memcached还是tmpfs都不适用于持久性——如果您需要数据持久化(即在重新启动后仍然可用),则需要使用类似数据库的东西。


最后,虽然我不确定tmpfs,但至少在以下情况下我会使用memcached:

  • 会话
  • 缓存

为什么?因为它是:

  • 成熟——被广泛使用,有许多库等
  • 可扩展的

谢谢你的回答。我正在使用MySQL数据库来存储用户信息,并需要memcached或tmpfs来(临时)存储聊天消息,因为我不想在每个ajax请求中运行数据库查询;)。 我不确定应该如何在memcache中存储这个。聊天室有多个房间,用户只能看到他们应该看到的消息。我可以使用多个键值对。 我认为memcache更适合我的项目 :)。 - D.Unknown
嗯,我不确定非持久性机制是在这种情况下最好的选择:例如,如果您想保留对话历史记录,则使用数据库会更好;关于“不为每个Ajax请求命中DB”的问题,聊天想法和Ajax请求:您应该搜索“彗星”:基本上,这是一种不让客户端频繁发送Ajax请求到服务器,而是让服务器向客户端推送更新的方法(在stackoverflow上有很多关于彗星的问题;也许有些可以帮助;-))。 - Pascal MARTIN
我知道Comet,但不确定它是否对此有帮助。脚本仍然需要查询数据库/内存缓存以获取新消息,因为PHP实例无法通信。我还尝试编写自己的Web服务器来解决这个问题(http://stackoverflow.com/questions/2357596/http-stream-server-threads),但我在C#/ C ++方面不够好。 - D.Unknown

0

无论是ramdisk还是memcached都非常快。

如果您在解决问题时使用MySQL,我认为速度并不重要。

个人而言,我更喜欢Redis而不是memcached。

以下是优缺点:

  1. 如果没有RAM,memcached可能会删除密钥。 Redis和文件永远不会这样做。

  2. 一些软件(如Joomla)在会话不在文件中(例如memcached / redis)时无法安装

  3. memcache和redis都能够为多个php服务器提供服务,因此您将无法在集群中使用stick会话。

  4. memcached比redis、ramdisk、memcachedb、mysql和文件系统会话更快。

  5. ramdisk模拟正常的php会话行为,不需要安装任何东西。

  6. 如果ramdisk无法挂载,php将回退到文件系统并仍然可以工作(假设服务器引导)

  7. 如果memcached或redis停止工作,php会给出恶意错误并且根本无法启动。

希望这有所帮助。


0

对会话数据的写访问必须是原子的或由每个会话锁保护,否则它将被破坏。对于基于文件的会话,通过锁定文件来解决此问题,但不知道memcached如何处理。 使用单独的ext4分区并不像您想象的那样糟糕 - VFS将在RAM中缓存您的文件I/O,因此您可能不需要任何其他东西。 您可以微调ext4(在分区上)以缓存您的写入,因此您可以获得类似RAM大小的性能和持久性。 例如,您可以使用此设置获取writeback缓存和60秒窗口(延迟提交):

mount /dev/sda4 -t ext4 -o rw,data=writeback,nobh,commit=60  

它将工作得很快,不会出现内存不足的情况,它将使用所有可用的内存,因为文件系统缓存是动态的。 尝试将4MB文件复制多次到第二个文件中(覆盖它),你会得到非常快的写入速度。


-1

实际上,您可以使用memcacheDB来满足您的需求。


提供更多细节。当链接丢失时,你的回答就没有意义了。 - Sampath
其实这不是一个坏主意。memcachedb非常快。但它比内存慢得多,而且我不喜欢使用不稳定的软件。(不确定memcachedb目前是否稳定)。赞同你的思路。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接