如何用不同优先级的条目轮询数据库

假设有一组优先级从1到4不等的条目,其中1是最重要的,4则是最不重要的。那么我该如何创建一个系统来轮询中央数据库以获取条目列表的更新,而更频繁地轮询优先级较高的条目呢?

例如: 我有优先级分别为1、2和3的条目a、b和c。

在一个完美运转的程序中,条目a应该比b和c更频繁地轮询更新,而b应该比c更频繁地轮询。

我的主要问题就是设计一个系统,使得所有条目仍然能定期轮询,但是最高优先级的条目会更频繁地轮询。

很抱歉我没有更多的细节,但我真的没有任何源代码或其他东西来构建,我现在有点一筹莫展。

另外,我正在使用Lua,但我只是在寻找想法的粗略伪代码版本,我想自己找出精细的实现。为了简单起见,可以用方法调用来表示轮询数据库:getDatabaseInfo(itemIndex);

所有答案都会受到赞赏,谢谢您的时间!

点赞
用户3979429
用户3979429

根据您希望每个值更新的频率不同,像这样的循环可能有效。

  • 优先级为一级的项目每次都会更新
  • 优先级为二级的项目每 2 个周期更新
  • 优先级为三级的项目每 3 个周期更新
  • 优先级为四级的项目每 4 个周期更新

代码:

for i = 1,math.huge do
    for ii = 1,#items do do
        if getPriority(ii) == 1 then
            items[ii] = getDatabaseInfo(ii)
        elseif i%2 == 0 and getPriority(ii) == 2 then
            items[ii] = getDatabaseInfo(ii)
        elseif i%3 == 0 and getPriority(ii) == 3 then
            items[ii] = getDatabaseInfo(ii)
        elseif i%4 == 0 and GetPriority(ii) == 4 then
            items[ii] = getDatabaseInfo(ii)
        end
    end
    sleep(interval)
end

它的工作原理是检查当前迭代次数是否可以被 1、2、3 或 4 整除。

您可以添加第三个嵌套循环,循环所有优先级,这样您可以拥有无限数量的优先级,但我把这个作为读者的练习 :)

正如 Piglet 在评论中指出的那样,您可以使用这个快捷方式使代码更有效:

if i % getPriority(ii) == 0 then ...
2017-01-06 11:01:51
用户1847592
用户1847592
local items = {  -- 所有的item都在这里
   {name = "item #1", update_period = 1  },
   {name = "item #2", update_period = 1.5}, -- item#2的更新频率比item#1低1.5倍
   {name = "item #3", update_period = 2  }, -- item#3的更新频率比item#1低2倍
   {name = "item #4", update_period = 3  }, -- item#4的更新频率比item#1低3倍
}

local function update_one_item()
   local min_ctr, itemIndex = math.huge
   for idx, item in ipairs(items) do
      item.current_counter = item.current_counter or 0
      if item.current_counter < min_ctr then
         min_ctr = item.current_counter
         itemIndex = idx
      end
   end
   for idx, item in ipairs(items) do
      item.current_counter = item.current_counter - min_ctr
   end
   items[itemIndex].current_counter = items[itemIndex].current_counter + items[itemIndex].update_period
   getDatabaseInfo(itemIndex);
   print(items[itemIndex].name.." updated")
end

for _ = 1, 20 do
   update_one_item()
end

输出:

item #1 updated
item #2 updated
item #3 updated
item #4 updated
item #1 updated
item #2 updated
item #1 updated
item #3 updated
item #1 updated
item #2 updated
item #4 updated
item #1 updated
item #3 updated
item #2 updated
item #1 updated
item #1 updated
item #2 updated
item #3 updated
item #4 updated
item #1 updated
2017-01-06 11:40:58