我有一个包含N
条记录的数据库表,每个记录需要每4小时刷新一次。 “刷新”操作非常耗费资源。我想编写一个偶尔运行的计划任务并刷新它们,同时平滑负载峰值。
我开始的最简单的任务是这个(伪代码):
every 10 minutes:
find all records that haven't been refreshed in 4 hours
for each record:
refresh it
set its last refresh time to now
(技术细节:上面的“刷新它”是异步的;它只是将工作线程池的任务排队以获取和执行。)
这导致每4个小时大量资源(CPU / IO)使用量激增,其余时间机器空闲。由于机器也做其他事情,这很糟糕。
我正试图想办法让这些刷新或多或少均匀分开 - 也就是说,我想要N/(10mins/4hours)
,即N/24
,那些记录,每次运行都要刷新。当然,它不需要准确。
注意:
N
的值。答案 0 :(得分:1)
执行完全刷新,以使所有时间戳同步。从那时起,每10分钟刷新最旧的N / 24条记录。
负载从一开始就是稳定的,经过24次运行(4小时)后,所有记录将以4小时为间隔进行更新(如果N是固定的)。插入将减少刷新间隔;删除可能会导致增加或减少,具体取决于删除的记录的时间戳。但我怀疑你需要删除相当多的东西(比如,你的桌子的10%),然后再开始推动40分钟窗口以外的任何东西。为了安全起见,每次运行可以做到N / 24以上。
答案 1 :(得分:0)
Each minute:
take all records older than 4:10 , refresh them
If the previous step did not find a lot of records:
Take some of the oldest records older than 3:40, refresh them.
这最终应该使最后更新时间更均匀地间隔开。什么“很多”和“一些”意味着你应该自己决定(可能基于N)。
答案 2 :(得分:0)
为每条记录提供自己的刷新间隔时间,这是3:40到4:20之间的随机数。