老师您好!
最近正打算利用MMKV替换SharedPreferences,研读了一下MMKV的源代码,发现他们在内存重组的时候是直接在原始文件中写重组过后的数据,并且重组完成之后没有sync, 感觉这样会有很大的风险。虽说mmap利用操作系统的机制来保证即使进程被杀,也能写数据, 但首先得保证把所有要写的数据写进mmap映射的内存中,如果在写完成之前进程就已经被杀了,那就有可能出现mmap中的数据是错误的,即使完成了写mmap内存,如果在操作系统将数据写入硬盘前突然关机,那也有可能丢失数据,造成最终的数据损坏。
而SharedPreferences的写操作,首先是将原始文件备份,再写入所有数据,只有写入成功了,并且通过sync完成落盘后,才会将Backup文件删除。如果在写入过程中进程被杀,或者关机,进程再次起来的时候发现存在Backup文件,就将Backup文件重命名为原始文件,原本未完成写入的文件就直接丢弃来,这样最多也就是未完成写入的数据丢失,文件是不会损坏的,所以可以认为SharedPreferences的写入在单进程中是安全的,也正是因为back的机制,导致多进程可能会丢失新写入的数据。
从MMKV的github上看到数据有效性的说明,在ios每天存在超过70万次的数据校验失败,是不是就是写数据实际是不安全的导致的呢?对MMKV和SharedPreferences的理解可能不对,请老师帮忙解答一下,谢谢!
展开
作者回复: 赞,研究的挺细的,大部分都对。不过mmkv有考虑这点做了crc检验,文件损坏之后支持recover模式,从文件中尽力而为的修复数据