是一种流行的开源内存数据存储,支持所有类型的抽象数据结构。在这篇文章和随附的示例项目中,我将探讨其中一种数据结构的两个重要用例:位图。两个用例:确定异步系统中的“完成”并收集不同的活动指标。示例项目的源代码可在上找到:什么是位图?在位图中,位数组的每个单独位或)用于表示一种状态。这释放了在极小的空间中表示大量状态的潜力当空间非常宝贵且需要表示大量状态时,这确实值得探索)。对于位图,使用字符串来存储此二进制数据,并提供一组将这些二进制字符串视为位图的命令。这些命令使得以恒定的时间复杂度设置和获取链中的任何位成为可能探索以下潜在用例的另一个有吸引力的原因)。第一个用例:在异步系统中完成首先,假设有一个由固定数量的步骤组成的异步任务。每个步骤都是并行处理的,您必须跟踪每个步骤的完成时间以确定任务何时“完成”。使用位图,其键是字符串,您可以通过在执行步骤时在每个步骤编号对应的偏移量处翻转一位从到)来跟踪每个步骤的状态。
如果首先翻转偏移量等于任务步骤总数的位
则当最终偏移位之前的所有位也都被翻转时,整个任务完成。例如,如果任务有个步骤,则将偏移量翻转位从到)会导致以下初始状态:在此示例中,偏移量和步骤编号基于零)现在,当步骤完成时,状态如下:完成步骤和后,状态如下所示:最后,当第 哥斯达黎加电话号码 步完成时,状态如下所示:并且因为偏移量处的最后一位之前的所有位都已翻转任务已完成)现在,让我们看一下我提到的示例项目。对于这两种用例,一切都从开始。在中,中有一个和一个定义),它将触发一个示例任务。计数表示激活的示例任务的步骤数。项目第一次与位图交互通过客户端)是在时。这是等于任务中步骤总数的位偏移被反转的地方如上所述)://将“最后”位设置为,为此任务初始化步骤结束标记//在该任务被视为完成之前,该“最后”位之前的所有位也必须设置为然后,该方法继续向中定义的并行发出每个单独步骤的请求。在上面的状态逐步示例中,我忽略了逻辑的一个重要部分。
您究竟如何确定最后一位之前的所有位都
已被翻转该逻辑位于的函数中,如下所示:字符串任务{//获取最小假位的索引来判断任务是否完成长//计算位的数量,即采取的步数长计数//检查是否已经完成件事使这一决定成为可能:命令将返回第一个位设置为的位置命令将计算设置的位数事实上,在触发器 塞浦路斯电话号码列表 应用程序中,第一个翻转的位是偏移量等于总步数的位。将这三件事放在一起,您就会知道,如果没有找到或者等于,则任务完成。让我们最后看一下状态的初始逐步示例:初始状态下,为,为任务未完成):当步骤、、完成时,为,为任务尚未完成):但最后,当第步完成时,和都等于任务完成!):第二个用例:收集不同的活动指标让我们继续讨论第二个用例:收集不同的活动指标。第一个用例描述了如何在给定标识符的唯一位置翻转位在执行每个步骤时翻转位),并且命令用于整个任务的命令。在这个用例中,您只需要这两个命令来计算和跟踪唯一用户的数量。让我们看一下示例项目中的。这个例子非常简单,我们的接受并且我们像这样设置相应的位//将该位设置为,这说明用户不同_如果该位已经像一样被翻转即该用户不是新的/唯一的),则下面记录的计数保持不变。