每天执行一次用户操作:24小时重置与午夜重置[关闭]


24

当用户每天只能执行一次动作(例如,获得比赛的免费门票)时,我会遇到两种可能性。

1)24小时重置

如果他在第1天的晚上11:45执行动作,则只能在第2天的11:45或之后再次执行动作。他将无法在第二天的11:44做到这一点。

2)午夜重置(或任何固定时间)

无论用户在第1天什么时候执行该操作,只要它变成午夜且第2天开始,他都将能够再次执行该操作。


两者都限制了用户每天仅执行一项操作,但是我经常遇到方法1,我认为这样做很不方便,原因有两个:

  • 首先,我必须等待时间
  • 在很长一段时间内,我执行动作的时间戳会变得越来越迟,因为我将无法在每天的那个时间戳上准确地执行动作,而只能在几秒钟或几分钟后执行。

有什么技术上的原因,尽管我认为对于事先说明的用户来说,重要的缺点是它会首选方法1?


编辑,以指定:我特别是在谈论一个示例,其中显然不需要24小时的实际时间间隔,例如在当前的Theory11自由旋转事件中,您每24小时可获得1次自由旋转以获得机会在获奖中。


5
可能有理由限制两次操作之间的实际时间,这就是为什么他们会选择24小时锁定。例如,使用选项2,您可以在23:59和00:00再次执行操作。
伊沃·库曼斯

21
答案将完全是针对特定问题的,并且不难提出适合两者的问题。开发软件是为了实现业务规则,而不是相反。
Blrfl

4
请注意,午夜是任意时间。您可以随时随地轻松地进行操作。
David Starkey

2
有点旁注,午夜可能会给夜猫子带来麻烦。为了解决这个问题,例如,《魔兽世界》会在凌晨3点或凌晨4点重置“每日”任务。
凯文(Kevin)

6
注意:游戏种类繁多,每21小时只允许执行一次动作。从理论上讲,每天可能会滥用此值以获取大于1的值,但这意味着要在半睡眠中醒来,这种情况很少发生,通常对于服务器来说并不是什么大问题。然后,它允许用户“每天早晨”登录,而超时不会在一天中缓慢增长。
Mooing Duck

Answers:


21

我很惊讶,因为我通常会期望午夜重新设置。

但是,它的确有一个主要缺点,即每24小时有一个以上的午夜。您需要选择时区。

也许这就是为什么选择每24小时通用一次的原因,您可以想象该公司可能不希望接受不同国家/地区的一半用户的本地时间不是午夜,或者他们可能认为“每天”暗示午夜因此,他们将市场营销更改为“每24小时”,并将软件规格更改为匹配

尽管我认为这几天看到“格林尼治标准时间下午2点结束”或类似情况很普遍。

我本来以为为每个用户存储上一个操作日期的挑战比为用户或操作类型分配时区的挑战要困难得多。

编辑我认为值得注意两种方法之间的差异

24小时规则

  • 我将获得恒定的事件流,速率限制为每24小时小于1。
  • 当我结束事情时,一些用户将获得较少的事件。
  • 我需要存储每个用户的最后一个事件
  • 当夏令时导致一天的忙碌或短暂时,我每天不会有1个事件
  • 人类将无法精确地命中24小时,因此我平均每天自然会少于1小时

每个日历天规则1个

  • 我在分配给一个日历日的50小时(?UTC + 14到-12?)期间收到大量事件
  • 实际上,我仍然必须将每个用户的最后一个事件存储为“天”
  • 我确实有一天的结束,我可以说现在以后的所有事件都不在当天。
  • 我需要知道用户的位置,才能知道他们的活动适用于哪一天
  • 有些人在“一天”中醒得比其他人早得多

UTC规则中每个日历日1个

  • 我每天24小时都穿着漂亮的制服
  • 我可以整理活动
  • 我知道一天的开始和结束时间
  • 夏令时会让人们感到困惑。
  • 人类每天可以进行1次活动
  • 不住在格林威治附近的人类将有有趣的开始和结束时间
  • 也许我可以做一个聪明的优化,只存储已输入用户的列表?(可能最终我将存储每个用户的事件和时间)

*对事件进行批处理将对各种报告用途超级有用。例如。说我每24小时要赢得10个奖项,而且它们随时间而变化。第10天有多少学生报名?等等


当我同样感到惊讶时,您显然会触动我的思路。我认为进行24小时重置会比较懒惰,但是正如@Richard Ward的回答指出的那样,遵守所有时区可能会更加困难,甚至在事件开始和结束时都会引发通信问题。
RUL

嗯,我想你的答案很困惑。但是经过反思,我认为这很可能是业务/开发人员之间的沟通问题。我可以想象计划会议...销售:“因此,每天只能允许用户接受一次报价。”开发人员:“如果他们乘飞机飞越国际日期变更线怎么办?他们可以下两个订单吗? ” 销售:“ .....否...每24小时说1个”开发人员:“好吧,嗯,gona需要更多表来存储所有数据!” 销售:“ whateves”
Ewan

我知道,您认为24小时制不太复杂吗?因为我认为除了拥有额外的表格外,仅说24小时要比在不同时区进行检查和计算简单得多。但是您在这里有了一个很好的观点:离开时区,您实际上可以获得不止一个旋转。
RUL

4
我认为解释
Ewan

10
这个。时区相关的东西会打开一堆蠕虫,您可以使用24h超时规则将其关闭。而且,存储动作发生的确切时间并不比存储特定日期发生的困难。
cmaster

14

从我的头顶上:

  • 实施“自上次行动以来的24小时”版本可能会更容易
  • 如果用户没有在上一次之后的24小时内准确执行操作,那么最终他们可能会错过整个24小时的时间,因为必须在他们入睡或工作时进行重置。也许他们是在早上7点才去上班,然后在晚上8点才去上班。第二天,他们在7:15,然后7:30,然后7:45进行操作,并在最后一天停留到8:00,然后在离开前执行操作。第二天他们不愿意一直待到8:15,所以只想念那天早上,在下午6点下班回到家后(间隔34小时)去做。如果行动的结果对公司来说是昂贵的,那么节省可能比不便更为重要。

3
关于偷偷摸摸的行销理由,让用户错过一天。
RUL

1
@RUL或者更重要的是,如果用户错过了免费旋转,则更有可能购买“额外旋转”(或其他任何东西)。放弃旋转的成本可能微不足道,但偶尔的额外销售可能是值得的。
TripeHound

我在美国时曾玩过基于祖鲁时间的游戏。当我能够或不能进行一项活动时,保持直率并不容易。
Cort Ammon-恢复莫妮卡

2
第2点是为什么暴雪(etc)避免在《魔兽世界》和其他MMORPG中使用24小时重置计时器,而是每天重置的原因。
Adonalsium

8
可能值得注意的是,有些公司只是使用不太严格的“每日”-英雄联盟对“一天的第一场胜利”使用21小时的锁定。足够每天大致保持奖金,同时方便玩家。可能部分是因为您并不总是会赢得第一场比赛,并且比赛需要大约30至50分钟的时间,因此严格的时钟安排确实很烦人(因为您可能会将时间推迟30分钟左右一天,这并不诱人,因为在繁忙的赛程中,您只有三天的游戏时间才能赢得第一场胜利。
Delioth

8

正如其他答案所提到的那样,24小时方法对多个时区更友好,并且就像为每个用户存储最后一个成功的时间戳一样,其编码也很容易。

它还具有实际要求用户每天与应用进行交互以获取所有日常操作的“好处”。如果说要进行午夜重置,则用户可以在11:59 PM,然后在12:00 AM再次执行操作。他们可以隔天这样做,但仍然可以执行所有操作。对于某些应用程序,日常操作的目的是使用户每天与应用程序进行交互,因此不太理想。

还有第三种选择可以避免两者的UI陷阱,但是很难编码。

3)在(n-0.75)* 24小时内没有超过n个动作的条纹

它确实需要存储两个变量,但是它允许不试图滥用系统的人在一天中的任何时间都可以使用其一项操作,而不必担心时区和重置。

它还可以防止任何人使用多个“额外”操作。

因此,实际实施算法需要存储连胜的开始时间,最后一次播放时间以及连胜中的动作数。

跟踪上一个动作时间可以使您拒绝两个过于靠近的动作。您可以将限制设置为少于24小时,因为条纹可以防止在一天中的早些时候爬行。

只要您每天采取行动,条纹就会持续不断。如果采取某项措施意味着您在连胜中要采取的行动多于几天,那么它将被拒绝。这样可以防止缓慢向前爬行,并打包“额外”动作,因为条纹的开始时间不会改变。

一些伪代码来实现检查和跟踪时间:

//precondition: streakStart and  lastAction are initialized as in the far past
//              streakCount is initialized as 0
graceHours=18;
checkAllowed(currentTime,&streakStart,&streakCount, &lastAction){
    diffhours=hoursDifferent(lastAction,currentTime);
    if(diffhours< 24 - graceHours){
        return false;
    }
    diffhours=hoursDifferent(streakStart,currentTime);
    if(diffhours <= 24*streakCount - graceHours){
        return false;
    }
    if(diffhours > 24*(streakCount+2)-graceHours){
        streakStart=currentTime;
        streakCount=0;
    }
    streakCount++;
    lastActionTime=currentTime;
    return true;
}

作为额外的奖励,如果您需要的话,您还会获得连胜柜台。


我认为这可能是最好的答案,因为它对用户“有效”。唯一的缺点是可能很难理解,但这只会影响尝试使用该系统的人们。18 graceHours可以在文本中解释,因为我认为完成这项工作很重要(尽管我认为应该更低)
rtpax

有趣的方法,固执,请您详细说一下,这是怎么工作的?
RUL

@RUL的基本思想是,用户在执行第一个操作后便会锁定重置时间。它并不是在他们执行操作的确切时间锁定的,而是在此之前(在这种情况下,是18个小时之前)提供了更好的用户体验。这样一来,用户可以稍微领先一步(他们可以在6个小时内执行前两个操作),但是由于开始时仍处于锁定状态,因此不会出现累积错误-如果他们已超出宽限期,则必须在下一个动作至少需要24小时。
Jacob Raihle 18/12/19

5

关于您的操作间隔24小时的问题,有些公司改用22小时间隔,这样用户在需要执行操作的当天的确切时刻会有一些回旋余地,并且仍然可以鼓励用户实际执行操作每天一次-没有23:59-00:00漏洞。

没有答案,但是我没有足够的意见要发表。


我认为该网站使用诸如投票之类的消耗性物品来做到这一点。他们不会每隔24小时重置一次,而是每隔16个小时重置一次(不确定确切的数字)。我想这很有道理-假设您从上午8点开始新的一天,然后开始上下投票-在下午2点的6个小时内,您的投票用完了。严格执行24小时动作复位后,如果您在最后一次投票中选择了重置时间,则需要等到下午2点才能开始投票,而不是通常的时间,这样您可能就没有时间了。如果您选择第一票,那么如果有一天您从上午10点开始投票,而下一天又有8点开始投票,就会遇到问题。
VLAZ

尽管现在我已经考虑过了-我不确定是否真的需要16个小时的重置时间才能开始执行操作。可能是24小时,而我恰好在每天重设8小时后才抓到它。但是我猜想逻辑仍然成立-如果您有24个单独的计时器,那么这可能对用户不方便。
VLAZ

这确实存在与34小时重置相反的问题,即如果用户总是尽可能快地采取行动,他们便可以打包额外的动作(当然,这需要可怕的睡眠时间表...)
Rick

3
tl/dr: 24 hour resets are the lazy man's way of minimizing load spikes

除了上述答案外,午夜重置还鼓励交通流量激增。如果在特定时间所有参与者都可以使用该操作,那么将有许多人同时尝试该操作的动机。这就是为什么大多数州的驾照在您的生日而不是固定的日期(美国)到期的原因:如果每个人的驾照在1月1日到期,DMV将无法跟上。

不用多说:如果计算机系统每天需要对大量用户采取措施,那么您可以提出相同的问题,我通常将其设计为两者的结合。您可以想象两个cron任务:

  1. 在午夜运行,查找所有记录,采取措施
  2. 每分钟运行一次(或按固定频率运行),查找自昨天00:00以来未采取任何行动的所有记录,采取行动,记录已采取行动

实际上,我发现前者很脆弱。如果cron任务在运行时中断,则可能未应用某些操作,因此系统可能需要执行其他工作才能记住它在哪里,并在中断的地方继续工作。如果您获得了足够的记录,而您的cron任务无法在合理的时间内处理所有记录,那么它也会引起问题,并且在完成之前将其关闭。

后者解决了这两个问题。这样做的目的并不是要使所有任务都准确地分开处理24小时,但是只要您的cron任务可以轻松地每天执行所有操作,它们就会非常接近,并且您可以保证每个人都可以在每天的实际情况下运行(即您不会在超过24小时的时间内慢慢消失)。但是最重​​要的是,如果由于某种原因发生故障,它很容易从中断处恢复。

https://www.youtube.com/watch?v=hoMO1yYC7pQ


0

TfL(伦敦交通)的每日巴士/火车票的有效时间为4:30 am至4:30 am。人们入睡时进行切换。很多人都想在午夜8:30至一个小时之前使用服务说


4
对于严格的本地使用来说,这是很好的选择,但是如果您期望通过互联网进行交互,那么您将无法选择适合所有人的重置时间。即使是当地人,睡眠时间也有所不同-轮班工人等。轻微异议,不足为-1。
科里

@Corey Steam确实将他们的大多数计时器绑定到太平洋时间上午10点。更具体地说,这是对所有促销活动的更改-每日(每天10 AM),周中(周二10 AM-周五10 AM)或周末(周五10 AM-周一10 AM)。作为一家国际商店,它适用于每个人-中欧时间19:00或纽约时间13:00。也许并不是每个时区都方便,但是它是一致的。而且,坦率地说,即使我使用PT,早上10点也不是很方便-我在欧洲,所以晚上对我来说更好。
VLAZ

0

午夜重置有一个特定的条件,该条件可能是理想的,也可能是有害的,具体取决于您要解决的问题,即:我可以在一天的11:59:58处执行操作,然后在00:00:01处执行。如果问题空间是任何竞争,这都可能给选择在午夜之前执行其操作的人们带来不公平的优势。24小时重置规则是确保公平分配可用操作的唯一方法,而不管某人一天中的什么时间可用。

可以通过提供公差来缓解24小时重置的后果,例如,只要没有实际记录(或不采取行动),就可以在重置发生后的15分钟内接受动作请求效果),直到发生重置为止。这给解决方案带来了更多的复杂性,但是我想不出任何缓解策略,像午夜重置一样,能够间隔两秒执行两次日常操作。


0

我从未见过有人提到24小时制鼓励定期例行造访。许多游戏都有每天一次的登录/胜利奖励,该奖励会在24小时后重置,因为它们希望您每24小时检查一次,而不是每48小时检查一次。我想这对于托管机票赠品的网站来说是相似的。


1
除了少数人,这两种方法都会强制进行24小时的重新访问,他们等待48小时并在23:59:59和00:00:01执行操作,但是我认为这是无关紧要的。
RUL

@RUL对于很多在我方便的时区具有重置时间的游戏,我使用连续两次签入方法。因此,我认为这并不像您想的那样重要。通常,我不会每48小时登录一次,但几乎每次登录时我都会得到2次操作。
里克(Rick)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.