我们说我有一台服务器,连接的客户不断更新他们的库存。
我可以在项目更新后将更改保存到数据库中,或者我可以在客户端离开会话后更新整个库存。
如果我采用第一种方法,根据我目前的规格,我无法同时处理所有这些。如果我选择第二个,并且由于某种原因我的应用程序死亡,则更新永远不会存储在数据库中。
我该怎么做才能解决这个问题?
我只能提出两个解决方案(两者都意味着校验和):
运行辅助应用程序,它只创建一个命名的共享内存。主应用程序将使用此内存作为所有客户端的清单,如果我的应用程序死亡,则辅助应用程序将保持共享内存,因此数据可以在主应用程序重新启动后保存。
将每个客户端映射到一个文件,即user1.dat,user2.dat,就像共享内存一样。但是,这会让我的节目变慢吗?还是像指定的共享内存一样快? (如果我理解正确,它应该一样快)(这是我现在的顶级列表中的那个)。
更具体地说明第二种方法:
至少在Windows中是否有保证,以下3种方法在写入/读取时都会一样快? 如果有任何延迟,我需要知道。
据我了解,甚至文件映射方法都会立即更新内存,但不会更新文件本身(这很好)。
// normal memory accesss
int *normal_address = (int*)0x10203040;
*normal_address = 6; //write: 0.00002sec (for example)
int get_value = *normal_address; //read: 0.000001sec (for example)
// named shared memory
int *normal_address = (int*)0x10203040;
*normal_address = 6; //write: 0.00002sec (for example)
int get_value = *normal_address; //read: 0.000001sec (for example)
// memory mapped file
int *normal_address = (int*)0x10203040;
*normal_address = 6; //write: 0.00002sec (for example)
int get_value = *normal_address; //read: 0.000001sec (for example)
备注:
我的应用程序是使用C ++和Windows API编写的。两种方法(内存映射文件和命名共享内存)都使用以下函数:
CreateFileMapping
OpenFileMapping
MapViewOfFile
主应用程序将每天更新,因此最终可能会出现nullptr或其他内容。源代码有点旧,将由多人更新。
辅助应用程序将创建一次,除非需要,否则永远不会更新。因此,没有理由相信如果代码编写良好,将来不会发生任何错误以使其崩溃。
思考(如果需要,请忽略):
也许辅助应用程序可以在没有同步的情况下备份数据:首先检索校验和,然后获取整个清单。如果校验和不匹配,则它会再次尝试。
也许另一种选择是让辅助应用程序成为实际处理项目的人。