#[derive(Clone)] pub struct DatabaseHolder { pub database_lock: Arc<Mutex>, } 目前是想要实现redis的rdb,当前是有许多线程会读写DatabaseHolder。然后做rdb的线程会获取锁,然后clone数据结构,再把锁drop掉,然后把数据写入到文件中。
碰到的问题:clone会造成内存突增,内存大概增长一倍的样子。原生的redis是使用fork+copy on write技术实现rdb的,在rust中怎么实现呢?
1
共 5 条评论, 1 页
评论区
写评论1就是最经典的fork呀。
当调用fork系统调用后,父子进程的页表均映射到相同的物理地址(页帧),但是此时的双方页表项对可写区域权限为不可写,但是对于其vma来讲是可写的,这时父/子任意进程对内存进行写操作会触发保护异常,异常判断是cow导致后会讲内存进行复制,然后改写对应页表项的指向,从而减少内存复制的情况。
所以你想要备份时减少内存分配就用fork,代码大概是这样。
--
👇
lsk569937453: 1.这个方案暂时没想明白。有详细一点的方案吗? 2.dashmap是来替换RwLock的,我们无法假定用户使用redis是写多还是读多,因此数据结构无法替代Mutex。 3.rdb的目的就是将某一时刻内存中数据全部保存到文件中。因此分批次备份会导致rdb的数据不正确。这个分批次备份逻辑有问题。
--
👇
Bai-Jinlin: 三个解决方案。
1.这个方案暂时没想明白。有详细一点的方案吗? 2.dashmap是来替换RwLock的,我们无法假定用户使用redis是写多还是读多,因此数据结构无法替代Mutex。 3.rdb的目的就是将某一时刻内存中数据全部保存到文件中。因此分批次备份会导致rdb的数据不正确。这个分批次备份逻辑有问题。
--
👇
Bai-Jinlin: 三个解决方案。
这个搜到过,不过没想好数据结构。有详细一点的方法吗?
--
👇
liming01: 用Cow类型,参见: https://doc.rust-lang.org/std/borrow/enum.Cow.html
三个解决方案。
用Cow类型,参见: https://doc.rust-lang.org/std/borrow/enum.Cow.html