1.数据映射到内存
2.在内存中进行数据运算
3.将结果放入队列
4.队列与数据库同步数据
假设有一张表,并对此表做增删改操作
字段名 | 类型 |
Key | INT |
Value | INT |
如果操作的次数很多,且每次都直接用数据库更新,这很显然是不现实的
我需要映射到内存中做操作,然后用计时器批量更新数据。
为了保证内存数据与数据库的同步,我构建了以下对象:
Class Unit
{
public int key;
public int value;
public int control;
}
字段control是实现同步的关键。他表示内存中数据的几种状态,分别是:正常(0)、待新增(1)、待更新(2)、待删除(3)、直接删除(4)
状态的解释:
0:数据库映射到内存中时,control = 0,计时器更新时,不理会此条数据
1:New Unit时,control = 1,计时器更新时会把它添加入库
2:对Unit做更新操作时,control = 2,计时器更新时会做数据库更新操作
3:对Unit做删除操作时,control = 3,表示打上删除标记,计时器更新时会做数据库删除操作
4:对New Unit做删除后,control = 4,计时器更新时会直接把对象删除
那么control值在各种操作情况下的变化是怎样的呢?见下表:
control | 新增操作1 | 更新操作2 | 删除操作3 |
0 | X | 2 | 3 |
1 | X | 1 | 4 |
2 | X | 2 | 3 |
3 | 2 | 2 | X |
4 | 1 | 1 | X |
下面举例,依次分析上面的变化情况:
示例一:
数据库中的原有数据:
Key | Value |
1 | 10 |
映射到内存
Unit Unit1 = new Unit(1,10)
Unit1.control = 0
step1:我对Unit1做更新操作后,Unit1.control = 2,即表示待更新的数据(见第一行的更新操作)
step2:如果计时器到时间了,那么会把Unit1的数据更新到数据库,更新成功->Unit1.control = 0
step3:如果计时器时间还没到,而我又做了删除操作,那么Unit1.control = 3(见第三行的删除操作)
step4:此时如果计时器到时间了,那么会把Unit1从数据库删除掉,删除成功->Unit1.control = 4
step5:如果计时器时间还没到,而我又做了更新操作,那么Unit1.control = 2,回到step1(见第四行更新操作)
示例二:
我们需要新增一条记录:
首先找内存中是否已经存在有此Id的对象,如果有,则直接引用该对象,此时Unit2.control = 1
Unit Unit2 = new Unit(2,20)
Unit2.control = 1
step1:我对Unit2做更新操作后,Unit2.control = 1,即新增数据,无论如何修改,始终为待新增数据(见第二行更新操作)
step2:我对Unit2做删除操作后,Unit2.control = 4,计时器到时会直接删除掉Unit2
其他的各种操作,对照上表,就可以达到同步