【发布时间】:2014-05-25 14:20:03
【问题描述】:
我需要实现一个大型内存键值存储来维护系统运行时数据。主线程(或者我们称之为事务线程)频繁更新键值存储,检查点线程每隔几分钟拍摄键值存储的快照并转储到磁盘。现在我希望检查点线程可以在不暂停事务线程的情况下拍摄快照。当我在网上搜索时,我们可以简单地调用 fork() 来获取父进程的一致快照。但是由于某些原因,我的程序中不允许使用 fork。所以我正在寻找其他一些解决方案来解决这个问题。一种可能的解决方案是,我们在事务线程中使用带有 MAP_SHARED 的 mmap() 将文件映射到虚拟内存,然后在检查点线程中使用带有 MAP_PRIVATE 的 mmap() 映射相同的文件。不幸的是,正如我所测试的,事务线程执行的更新仍然会被检查点线程观察到。这是因为以下reason:
MAP_PRIVATE Create a private copy-on-write mapping. Updates to the mapping are not visible to other processes mapping the same file, and are not carried through to the underlying file. It is unspecified whether changes made to the file after the mmap() call are visible in the mapped region.
我想知道是否存在任何其他解决方案来处理这个问题?提前致谢!
【问题讨论】:
-
实现键值对存储并非易事,您是否有理由不能使用现有的其中之一(如Redis)?
-
我实现的key-value store其实很简单——没有Redis采用的各种复杂技术:P
-
更新了非 Redis 案例的答案。