收集数据库更改以供日后

时间:2016-08-16 16:17:52

标签: php mysql memcached

我目前面临游戏问题,即最近获得了大量活动。

游戏的前提是与其他玩家进行互动以给予他们的角色EXP(希望他们会回报你的好处,这样你们都会获得奖励)。但是,这意味着有很多UPDATE x SET `exp` = ? WHERE `id` = ?类型的查询。

除此之外,选择随机用户接收双重EXP,这种效果是传染性的"因为它在当前主机的时间内根据活动传递给另一个。这使得该特定用户非常期望并且可能接收EXP,从而导致那里的活动集中。 (竞争条件在这里并不是一个真正令人担忧的问题,任何因竞争条件而失去的EXP都无法结束世界)

作为测试,我暂时禁用了EXP增益,因此服务器延迟大大减少(仍在收集结果)。这让我觉得EXP收益确实是罪魁祸首。

我已经有Memcached保存数据,所以在大多数情况下,数据库只有UPDATE个查询,很少SELECT个。我想要做的是积累这些EXP增益并经常通过Cron脚本应用它们来尝试减少该表上的活动。基本上,不是每个用户的交互修改表,而是存储,然后由单个进程应用更新。

然而,我当时遇到的问题是"我如何存储这些TODO EXP收益"?

虽然我可以使用Memcached来存储它们,但Memcached并不适合任意键/值对(例如,key =应用EXP的东西的ID,值= EXP获得)和我&m;我不确定如何检索该列表。

另一种选择是使用一个单独的表来列出EXP增益。它实际上是CREATE TABLE `expgains` (`apply_to` INT..., `deltaexp` INT...),其想法是它只包含EXP更改(可能是十万行而不是~20M)而没有其他数据。然后,Cron脚本可以原子方式读取并擦除表并立即应用这些EXP更改。

但是,我不知道移动问题是否会真正解决问题。

其他任何想法如何去做?或者对上述想法的看法?

0 个答案:

没有答案