首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于时间的事件数据库(方法)

基于时间的事件数据库(方法)
EN

Stack Overflow用户
提问于 2016-08-21 06:10:16
回答 3查看 141关注 0票数 1

我有一个一般性的问题,而不是一些代码。因此,我只是要求采取一种一般性的做法。

在我的游戏中,我有一些基于时间的事件,比如在常见的应用程序中,例如部落冲突。用户可以选择提高字符的技能。假设人物“约翰”的攻击等级为1。要达到下一个等级,即2,需要1天的训练时间。

现在我的问题是,我怎样才能做到这一点。我不想用简单的倒计时来处理这个客户端,因为他可以操纵计时器的风险太高了。我想把它放在网上的某个地方,客户端正在向服务器请求还有多少时间。

最好的办法是什么?

  • 我知道MySQL中存在基于时间的事件,所以我可以每5秒运行一次任务,但我认为这不是最好的方法。

编辑:

我的问题是,如果约翰开始他的训练,必须在客户端倒计时。但是这个倒计时不应该收到剩余的时间客户端。应用程序应该从服务器获得时间。

有了这个事实,这并不是很困难,因为我只需要向服务器发出请求,获取事件触发的时间,并使用now()计算剩余时间。

但我也想建立一个实时数据库。例如,用户"Marc“可以访问John的个人资料。如果时间被破坏了,约翰的档案里应该有第2级。但是,如果John还没有登录,那么就没有对服务器的请求,这样它就不会更新级别。

因此,主要的问题是,一方面,如果用户登录,我可以通过简单的post请求和更新经过的培训来更新数据库记录。但如果约翰不登录,而马克想要查看他的级别在他的个人资料,那么没有张贴请求,它是显示的第1级而不是第2级。

EN

回答 3

Stack Overflow用户

发布于 2016-08-21 06:17:04

假设你指的是日历时间,有多种方法。最重要的组件是存储状态更改发生的时间。不要将它存储为"1天“,而是将其存储为特定的日期和时间。

那么,你基本上有三个选择。

首先是将时间构建到应用程序的逻辑中。将2级时间设置为1级时间+1天。然后使用now()确定级别。这有一个缺点,即逻辑可能变得复杂。但对于一个简单的例子,如你的问题,这可能是正确的选择。

第二种方法是为每个状态变化生成一个事件,并在适当的时间对其进行调度。当事情以悠闲的速度进行时,这是可行的,但规模确实很差。必须处理事件管理和其他性能查询是很有挑战性的。

第三种方法是调度作业,比如说,每小时运行一次。这可以使所有必要的状态变化一下子就会发生。

票数 2
EN

Stack Overflow用户

发布于 2016-08-21 07:42:21

这不是你问题的答案。但我想我有你的应用程序用例。

用户级别是一个公开访问的属性。用户不能编辑级别的值,因为它是由服务器决定的。因此,每当向用户配置文件(无论用户登录与否)发出请求时,只需检查使用now()的级别和存储在数据库中的startTime是否为该用户配置文件。这将使用户能够获得当前更新的级别。

为了使它变得简单一点,您可以在数据库中存储endTime而不是startTime。endTime将存储升级级别的时间。

比方说,我在x级。要达到x+1级别,在请求升级后需要24小时。

将endTime存储为调用请求的时间之和+级别升级所需的时间。稍后,您只需检查now() >= endTime。

用例:

现在,考虑一个例子。我是一个用户,我发起了级别升级的请求,并从应用程序中注销。现在,谁访问我的配置文件将看到我目前更新的水平在那一刻。这件事解决了。但是,如果在游戏中执行的动作(例如黄金挖掘)的速度取决于用户的级别,该怎么办?在这种情况下,假设我在接下来的两天内没有登录。但是既然我的级别应该已经提升了,那么金矿开采的速度就应该在升级的那一刻提高两倍。

要处理这个场景,必须有一个服务器端脚本来处理用户的活动,以便进行基于时间的级别升级。

您可以实现一个cron作业,它可以处理后台数据库的更新。

票数 1
EN

Stack Overflow用户

发布于 2016-08-21 07:26:46

正如戈登先前所指出的:

首先是将时间构建到应用程序的逻辑中。将2级时间设置为1级时间+1天。然后使用now()确定级别。这有一个缺点,即逻辑可能变得复杂。但对于一个简单的例子,如你的问题,这可能是正确的选择。

他的第一个选择可能是正确的实现选择,并且具有很高的性能因素。如果实施得当,就应该有很好的规模。

为解决您的关切:

因此,主要的问题是,一方面,如果用户登录,我可以通过简单的post请求和更新已删除的培训来更新数据库记录。但如果约翰不登录,而马克想要查看他的级别在他的个人资料,那么没有张贴请求,它是显示的第1级而不是第2级。

您只需将业务逻辑添加到您的业务逻辑层中,只要有人查询John的配置文件,就会执行该逻辑层。业务逻辑可以简单地计算下一个级别的剩余时间,并在必要时显示校正后的值。这一逻辑还可能更新约翰的记录,以表明他已经达到了下一个水平。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39065132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文