【转】一个简单的内存同步到数据库的方法

转载自:一个简单的内存同步到数据库的方法


为了提高大量数据运算的效率,我一般都会采用以下方式:
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

其他的各种操作,对照上表,就可以达到同步

发表评论