以这种方式将memcache与php web浏览器游戏一起使用有问题吗? 背景

以这种方式将memcache与php web浏览器游戏一起使用有问题吗? 背景,php,memcached,browser,Php,Memcached,Browser,我们目前正在开发一款基于php、html和javascript的战略web浏览器游戏。 计划是让10000多名用户在同一个世界内玩游戏 目前,我们正在使用memcached来: 存储json静态数据、语言文件 存储可更改的序列化php类对象 (例如军队、存货清单、, 单元(集装箱、建筑物等) 在后面,我们有一个mysql服务器运行并保存所有游戏数据。通过ObjectLoader加载对象时,对象按以下顺序加载: 检查中的静态哈希映射 对象的脚本 检查memcache是否已经存在 你已经装进去了

我们目前正在开发一款基于php、html和javascript的战略web浏览器游戏。 计划是让10000多名用户在同一个世界内玩游戏

目前,我们正在使用memcached来:

  • 存储json静态数据、语言文件
  • 存储可更改的序列化php类对象 (例如军队、存货清单、, 单元(集装箱、建筑物等)
在后面,我们有一个mysql服务器运行并保存所有游戏数据。通过ObjectLoader加载对象时,对象按以下顺序加载:

  • 检查中的静态哈希映射 对象的脚本
  • 检查memcache是否已经存在 你已经装进去了
  • 否则从数据库加载,并且 将其保存到memcache和 静态临时哈希映射
  • 我们使用面向对象的方法构建了整个游戏,其中功能总是在对象之间实现的。正因为如此,我们认为我们已经获得了一个很好的结构,并且在memcached的帮助下,我们在与游戏交互时收到了来自客户端服务器的良好请求时间

    我知道memcache是不同步的,也不常用于在内存中保存完整的游戏。在服务器启动后的一开始,首次将对象加载到memcache时的加载时间会很长,但在服务器联机一段时间后,大多数加载都来自memcache,负载会大大减少

    目前,我们正在将更改的对象同时保存到memcache和数据库中。早些时候,我们有一个想法,只在一定时间后或每隔一段时间将对象保存到数据库中,但由于memcache/服务器出现故障时存在不一致的风险,我们暂时跳过了它

    客户端对服务器的请求通常返回对象的状态,即简单的json格式,而不更改对象,然后在浏览器中用图像和javascript直观地表示对象。但根据对象上次更新的时间,它会不时使用新信息更新对象(例如,包含计划建筑物时间进度的生成队列增加,和/或计划队列项目数组已更改)

    问题:
    • 你知道这是怎么回事吗 我们在这里瞎走路
    • 你希望我们有很多机会吗 如果有人加载,则会出现不一致性问题 并更新memcache对象 而其他人也这么做
    • 这样做是否可行 他做了吗?看起来很有效 很好,但到目前为止我们只有 4个人同时在线吗 时间
    • 其他缓存程序更合适吗 对于此类对象方法,比 内存缓存
    • 对于这种情况,你还有其他的建议吗
    更新

    因为它只是一个“普通网页”(没有小程序、flash等),所以我们正在实现这个游戏,以便服务器是唯一拥有“真实游戏状态”的服务器。。客户端上不同javascript对象的状态更像是服务器游戏状态的近似版本

    在执行某些重要操作之前,客户机的可视状态会不时更新为服务器的状态(例如,客户购买他能负担得起的兵营,要求服务器建造兵营,服务器根据服务器上的收入数据更新当前资源,然后尝试建造兵营或抛出错误消息,然后将资源、建筑物的当前服务器状态发送回客户)


    它不像真正的战略游戏那样是一款快节奏的游戏。更像是一款相当缓慢的3-4个月游戏时间的游戏,其中建筑物可能需要+1分钟到几天才能完成。

    不一致性是否真的是一个问题取决于你如何实现你的游戏。如果整个游戏在客户端用最终快照更新通常情况下,这并不重要,因为玩家只会获得更高的延迟(延迟是不可避免的)。如果你的游戏状态不同步,两个玩家的世界版本可能会在一段时间后向完全不同的方向漂移,这是你想要避免的


    但是你确定你真的需要memcache吗?这似乎给你的解决方案增加了更多的复杂性和潜在的不一致性。这可能是过早的优化。你已经依赖于数据库,如果你只使用数据库,性能会怎么样?如果设置正确,我希望你的数据库服务器能够缓存我所需要的一切n内存。

    如果正确理解这一点,您将定期(比如每分钟左右)从客户端汇集服务器以获取新信息?游戏是否在用户之间进行了大量交互(两个用户是否可能会相互更改缓存项)?缓存的项目平均有多大?它都是以固定的时间间隔汇集在一起的,比如每分钟一次,这样地图就会显示出一个非常接近的视图,而且甚至当用户在地图上滚动时,它也会要求一个新的副本。现在,如果两个用户更新了对象,那么他们可能会尝试更新同一个对象ame地图视图。如果有人在地图上监视你的军队,他会在请求地图内容时更新它。一种解决方案可能是在更新非你自己的对象时锁定它们。或者干脆让地图内容更新依赖于不断的服务器更新……据我所知,与数据库相比,memcached具有良好的可扩展性随着活跃用户数量的增长。目前,如果客户要求在其当前11x11平铺地图屏幕中显示所有内容,则打开memcache需要0.2秒,关闭memcache需要0.6秒。这可能是因为当我们设计整个系统时,我们一直在考虑memcache,试图在memcache打开时优化内容。正如您所指出的可能会增加更多的复杂性和不一致性,但现在重写所有代码已经太晚了。。