使用最少的查询数在数据库前面设计一个缓存层

时间:2019-07-16 12:21:18

标签: database algorithm asynchronous caching ehcache

我有多个工作在某个键上。这些作业是异步运行的,并被写入一些后写式缓存中。从概念上讲,它是这样的:

+-----+-----------+----------+----------+----------------+
| key |   job1    |   job2   |   job3   |   resolution   |
+-----+-----------+----------+----------+----------------+
| 123 | job1_res  | job2_res | job3_res | resolution_val |
+-----+-----------+----------+----------+----------------+ 

关键概念是我事先不知道有多少工作正在运行。相反,当需要写入记录时,我们添加“分辨率”(基于我们已经获得的当前工作结果),并将所有值写入数据库(如果有关系,则为MongoDB)

我还有一个load()函数,该函数在发生高速缓存丢失时运行。它的作用是从数据库中获取记录,或者在找不到记录的情况下创建一个新的(空的)记录。

现在,有一个时间窗口,其中记录不在缓存中也不在数据库中。在那个时候,一个“慢工作者”可能会写出它的结果,不幸的是load()函数会创建一个新记录。

从缓存中撤离时,记录将如下所示:

+-----+----------+-------------------------------+
| key |   job4   |         resolution            |
+-----+----------+-------------------------------+
| 123 | job4_val | resolution_based_only_on_job4 |
+-----+----------+-------------------------------+ 

我可以想到两种方法来控制此问题:

  1. 配置后写机制,以便它将等待所有作业完成(即留出足够的时间)
  2. 在发生写入事件时,首先在数据库中查询记录并合并结果。

当前解决方案的问题:

  1. 难以校准
  2. 要求对写操作进行额外的查询

最自然的解决方案是什么?

为了保证所有工作结果的分辨率,我是否必须实施解决方案2?

编辑:
从理论上讲,我认为即使实施了解决方案2,也不能保证解决方案将基于所有工作结果。

EDIT2:
如果后写机制保证操作顺序,则解决方案2可以。这可以通过将回写限制为一个线程来实现。

0 个答案:

没有答案