Calendar 设计问题:您将如何设计重复事件系统?

Calendar 设计问题:您将如何设计重复事件系统?,calendar,Calendar,如果你的任务是构建一个支持重复事件的事件调度系统,你会怎么做?删除重复事件时如何处理?你怎么知道未来的事情什么时候会发生 i、 e.创建事件时,您可以选择“每天重复”(或每周、每年等) 请每个回复一个设计。我已经习惯了Ruby/Rails,但是可以使用任何你想要表达设计的东西 我在一次采访中被问到这一点,但没有得到一个我喜欢的很好的回答 注:是的,但我希望得到一些更实际的细节,详情如下: 如果必须能够对重复事件的一个实例进行注释或以其他方式添加数据,该如何工作 事件更改和删除将如何工作 你如何

如果你的任务是构建一个支持重复事件的事件调度系统,你会怎么做?删除重复事件时如何处理?你怎么知道未来的事情什么时候会发生

i、 e.创建事件时,您可以选择“每天重复”(或每周、每年等)

请每个回复一个设计。我已经习惯了Ruby/Rails,但是可以使用任何你想要表达设计的东西

我在一次采访中被问到这一点,但没有得到一个我喜欢的很好的回答

注:是的,但我希望得到一些更实际的细节,详情如下:

  • 如果必须能够对重复事件的一个实例进行注释或以其他方式添加数据,该如何工作
  • 事件更改和删除将如何工作
  • 你如何计算未来事件发生的时间

保存事件时,我会将日程表保存到一个存储中(我们称之为“日程表””,然后我会计算下次触发事件的时间并将其保存,例如在“事件””中。然后我会查看“事件””弄清楚下一个事件什么时候发生,然后一直睡到那时

当应用程序“唤醒”时,它将计算该事件应在何时再次发生,再次将其存储在“事件”中,然后执行该事件

重复一遍

如果在睡眠时创建了事件,则睡眠将被中断并重新计算

如果应用程序正在启动或从睡眠事件或类似事件中恢复,请检查“事件””以查看已传递的事件,并相应地采取行动(取决于您希望如何处理错过的事件)


这样做会很灵活,不会占用不必要的CPU周期。

我以前在管理项目的数据库端时必须这样做。我要求将每个事件存储为单独的事件。这允许您仅删除一个事件或移动一个范围。删除多个事件比删除一个事件容易得多y并修改一个事件并将其转换为两个。然后,我们可以制作另一个表,该表仅包含一个recurrenceID,其中包含重复的信息。

在我的脑海中(在键入/思考时修改了一些内容之后):

确定所需的最小重现分辨率;这是应用程序运行的频率。可能是每天,可能是每五分钟

对于每个重复发生的事件,存储最近的运行时间、运行间隔和其他有用信息,如到期时间(如果需要)


每次应用程序运行时,它都会检查所有事件,将(今天/现在+复发解决方案)与(重新运行时间+运行间隔)进行比较,如果两者一致,则触发事件。

@Joe Van Dyk问道:“你能看看未来,看看即将到来的事件将在何时发生吗?”

如果您想查看/显示下一个事件的n个事件,则必须提前计算并将其存储在某处,或者动态计算并显示。这对于任何晚上的框架都是一样的

a)的缺点是必须在某个地方对其进行限制,之后必须使用b)。刚开始使用b)更容易


调度系统不需要这些信息,它只需要知道下一个事件的时间。

几年前,当我为自己编写一个日历应用程序时,我基本上只是从cron窃取了调度机制,并将其用于重复事件。e、 例如,在每月的第二个星期六(除一月外)发生的事情将包括指令“repeat=*2-12 8-14 6”(每年,2-12个月,第二周从第8个星期到第14个星期六,第六个星期六,因为我对一周中的几天使用基于0的编号)

虽然这样可以很容易地确定事件是否发生在任何给定的日期,但它不能处理“每N天”的重复事件,而且对于不熟悉unix的用户来说,它也不太直观

为了处理单个事件实例和删除/重新安排的唯一数据,我只跟踪计算出的事件有多远,并将结果事件存储在数据库中,然后可以在不影响原始重复事件信息的情况下修改、移动或删除它们。添加新的定期事件时,所有实例都会立即计算出来,直到现有的“上次计算”日期


我不认为这是最好的方法,但这是一种方法,在我前面提到的限制范围内工作得很好。

如果您有一个简单的重复事件,例如每天、每周或每周几天,在scheduler/cron/at functionallity中使用buildt有什么问题?创建可执行/控制台应用程序并设置何时运行?没有复杂的日历、事件或时间管理

:)


//我从实现一些时态表达式开始。这将负责计算计划项目实际发生的时间。这是一种非常优雅的方式。我最后得到的只是对文章内容的一个补充

下一个问题是弄清楚如何存储表达式。另一个问题是,当您读出表达式时,这些表达式如何适应不那么动态的用户界面?有人说只是将表达式序列化为一个BLOB,但要遍历表达式树了解它的含义是很困难的

解决方案(在我的例子中)是存储适合用户界面将支持的有限数量的情况的参数,并从中使用该信息动态生成临时表达式(在为优化而创建时可以序列化)。因此,Schedule类最终有几个参数,如offset、start date、end date