具有类似于竞赛条件的计时器悖论的缓存

问题描述 投票:0回答:1

我正在从链接中提取更新,并将其保存到缓存(数据库)。每个更新都有一个时间戳。我们将使用人类可以理解的时间来举例说明问题。

这些更新是一组时间戳记:[16:30, 16:34]。每次创建具有这些更新的视图时,我都会查看最后一个项目,在我的情况下为16:34,并将其与我存储的值进行比较表示访问该视图的时间,即“上次查看时间”]。 >,之所以需要它,是因为在下一个请求(用户可以刷新其页面)时,我可以告诉用户是否有新的通知:

//Start with the assumption that there are no new notifications.
new_notifications_count = 0;

for( notification as notification ) {
    if( notification->time > last_accessed_view_tiem ) {
        new_notifications_count++;
    }
}

return new_notifications_count;

此操作将在该页面上的每个请求上运行,因此每次用户访问该页面时都会进行检查,但是系统只会在用户最后一次单击视图时才进行存储,如果他单击了。

现在,这里变得一团糟:我每60分钟检查一次新更新,然后将它们存储在数据库中,以免每次访问页面时都不发出HTTP请求。

假设我上次将通知存储在数据库中的时间是16:37,这意味着下一次刷新数据是在17:37,但是我在16:55处进行了更新并在17:05处访问了视图:即使下一次更新到来,最新的更新时间也将是16:55,并将其与17:05进行比较,系统(上面的代码)会说“哦,实际上没有新的通知”。即使明显存在。

这是所有这些的视觉效果:

bogaloo

我该如何解决这种比赛情况?

我正在从链接中提取更新,并将其保存到缓存(数据库)。每个更新都有一个时间戳。我们将使用人类可以理解的时间来说明问题。这些更新是一组时间戳记:[16:...

caching architecture race-condition
1个回答
0
投票

已解决!

© www.soinside.com 2019 - 2024. All rights reserved.