随机查找方法

McL*_*vin 2 random postgresql perl time timer

我有一个postgres数据库,其中包含一个表,其中包含我想以伪随机间隔查找的行.有些我想每小时看一次,有的每天一次,有的每周一次.我希望查找在其时间窗口内以伪随机间隔进行.所以,我想每天做一次的查找应该在每次运行的不同时间进行.

我怀疑有一种更简单的方法可以做到这一点,但这是我的粗略计划:为每个查找项目设置一个设置列.当脚本启动时,它会随机化每次查找的纪元时间,并将其设置在设置列中,以确定下次查找的时间.然后我运行一个等待1的连续循环,以查看纪元时间是否与任何请求的查找匹配.在运行查找时,它会在下一次查找时重新计算.

我的问题:即使在设计阶段,这看起来像是一个胶带和缠绕的例程.这样做的正确方法是什么?

如果偶然,我的想法是正确的方法,我的想法是重复循环等待1正确的方式去?如果我有两次背靠背查找,我有可能错过一次,但我可以忍受.

谢谢你的帮助!

cjm*_*cjm 5

在表中为NextCheckTime添加一列.您可以使用时间戳或仅使用原始纪元时间的整数.在NextCheckTime上添加(非唯一)索引.

向数据库添加行时,通过获取当前时间,添加基本间隔,添加/减去随机因子(可能是基本间隔的25%,或适合您的情况的任何内容)来填充NextCheckTime.例如:

my $interval   = 3600; # 1 hour in seconds
my $next_check = time + int($interval * (0.75 + rand 0.5));
Run Code Online (Sandbox Code Playgroud)

然后在你的循环中,只是SELECT * FROM table ORDER BY NextCheckTime LIMIT 1.然后一觉睡到NextCheckTime返回由(假设它是不是已经过去),进行查询,并且如上所述更新NextCheckTime.

如果您需要处理由其他进程新添加的行,则可能会限制睡眠.如果NextCheckTime是在未来10多分钟,然后睡10分钟,重复SELECT,看是否有新行已添加.(同样,确切的限制取决于您的情况.)