什么更快?file_exist 还是 MySQL 查询?

5
我的网页游戏中,用户的某些玩家信息被缓存在PHP的$_SESSION中。每次加载游戏时,它会检查会话是否存在,如果不存在,则从MySQL数据库获取玩家信息,然后将其存储在$_SESSION中。
现在我的问题是,如果其他进程或玩家更新了玩家信息,他们无法更新另一个玩家的$_SESSION缓存。
我知道memcached很可能是解决方案,但我不确定是否应该花时间去做这样的事情。 $_SESSION缓存对我来说做得很好,除了这个问题。
我考虑过为此创建一个MySQL表,在每个请求中读取它,如果有玩家的记录,就重新创建缓存。
另一种解决方法是在目录中创建一个以玩家ID命名的文件。每个请求PHP都会使用file_exist检查是否应清除缓存。
你们会怎么做?它每次请求都会执行,所以优化非常重要。

1
将选择数据库选项,就速度而言,良好的数据库架构不会有太大的差异。但这不仅仅是关于速度,也涉及更好的管理。 - Hanky Panky
除非是极其特殊的情况,否则您总是选择数据库。在现实世界中,如果数据已经加载到内存中或整个表适合可用内存,则关系型数据库可能比平面文件更快。 - Dasun
3个回答

3

仅从设计角度来看,我会避免使用file_exists和directory方法。当然,“file_exists”很快,但它不会很好地扩展......如果用户更改了他们的名称会发生什么?

如果您正在使用APC(而且您应该这样做),您可以使用APC的用户内存缓存。只要您在单个服务器上,它应该为您提供类似于memcached的性能优势,而无需单独的内存缓存服务器进程。如果用户条目经常更改,则可能会遇到APC的碎片问题。在这种情况下,是时候咬紧牙关并使用memcached - 您甚至可以将会话数据存储在memcached中以获得性能提升。

此外,无论是APC还是file_exists解决方案都无法扩展到多个负载平衡的服务器-您需要DB解决方案或memcached。


从他们的主页上可以看到:“对于不经常更改的缓存,请使用APC”,但是玩家信息实际上会经常变化,因为它还包含了玩家的游戏统计数据。那么,它仍然有用吗? - Martin
1
@Martin 如果你在 APC 中频繁更改用户缓存,可能会遇到碎片化问题。这种情况下,你最好使用 Memcached。 - Ray
谢谢您的评论。我可能会更好地研究一下Memcached。 - Martin
@Martin,另外,请确保您查看的是memcached而不是memcache。两者都作为php模块存在,并且是两种不同类型的memcache服务器。 - Ray
那我可能会选择Memcached.. :) 非常感谢你的解释。 - Martin
显示剩余3条评论

1

如果只是关于缓存,而且您不想安装memcache(d),那么可以选择使用内存中的mysql表。虽然不像memcached那样快速,但仍然是一个不错的解决方案。并确保在所有表上创建适当的索引(也许这是更好的解决方案,没有缓存,直接从表中选择)。

CREATE TABLE t (i INT) ENGINE = MEMORY;

1
你所表达的并不是哪种方法更快,而是因为并发问题,SESSION方法已经不再适用。
如果你的数据可能会同时被修改,那么你的数据存储必须能够处理并发,并且无论你想使用什么缓存层,都需要根据你的问题性质进行相应的行为调整。

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