缓存数据与在PHP中重新计算

时间:2009-09-09 05:04:03

标签: php caching

这是情况的最低点。我正在用PHP创建一个角色扮演游戏。战斗系统由各种增益和减益效果组成。战斗可能需要几轮(这是针对AI)。

我对确保玩家数据的正确性有两个想法(buff和debuff随着时间的推移而过期。+ 5强度buff可能只持续1回合)。我可以

1)通过一个字符init序列来获取用户的数据并从项目,设备,被动技能改变他的数据,然后加入存储在会话中的buff。如果buff存在,我应用它。如果没有,它就消失了。这样就可以保证数据的正确性,但需要考虑性能......我假设。

2)将整个角色数据存储在会话中,并更新buff。当buffs处于活动状态时,我会添加修饰符,如果debuff / buff消失了,我必须记住“回滚”或清理buff所具有的任何效果。我假设这对DB不那么费力,但很难确保正确性,因为可能有很多不同类型的buff。

所以就

而言

a)数据库开销 b)战斗系统的可维护性 c)有关此类案件的行业惯例,

2种解决方案的价格如何?还有更多我不知道的事情吗?我正在考虑使用订户模式来实现#2,但由于Web是无状态的,似乎会增加更多开销。

3 个答案:

答案 0 :(得分:3)

我把Knuth拉出来:“过早的优化是万恶之源。”

您不知道此设计决策的实际性能影响是什么,而您正处于开发阶段。如果没有实际数据,就无法确定这是否会成为未来的瓶颈,可能会有其他因素导致您的应用程序比您应该知道的速度慢10倍。

措施。测试。使用真实世界数据。优化。

答案 1 :(得分:2)

我将在这里“不”,并告诉你我将采取的方法。

我可以假设,由于您的问题,您显然计划拥有一些不错的流量,并希望确保您的应用程序在负载下运行。话虽这么说,你应该记住这里的会议性质。如果您需要通过添加多个Web服务器来分散前端以分散负载,那么PHP的基于文件的常规会话处理变得相对无用,因为您无法确保Web访问者将访问相同的前端服务器所有的时间(好吧,你可能会,但这很难)。如果您存储游戏状态,存储到cookie可能不是最佳选择,因为您可能拥有超过4Kb的数据。

因此,接下来的步骤是将会话移动到具有新处理程序的中心点,该处理程序通常是您的数据库。您通过存储到会话所获得的任何数据库收益现在都有一个偏移,因为您仍然需要访问数据库。它可能不会那么昂贵,但它并不理想。基本上,您只是捆绑数据并以不同的形式重写它。

我将遵循的可伸缩性模式最接近您的#1。最初,每次都重建buff并确保数据的正确性。使用会话来缓解某些性能,但不要过多依赖它们。当您开始遇到性能问题时,您将有几个选项。可能的优先顺序是:

  • 安装并使用memcached。而不是缓存到会话,缓存到内存!更快,更好的性能提升。
  • 将数据库和Web服务器分隔到不同的服务器上。
  • 随着您的不断发展,将会话处理程序更改为面向数据库,并添加更多Web前端

答案 2 :(得分:0)

角色数据有多广泛?简单地将所有角色的统计数据和项目存储在会话中是否可行?如果是这样,你可以充分利用两个世界。