Bootstrap

SharedPreferences 和 MMKV 是何方神圣

一、概述
SharedPreferences 和 MMKV 都是Android平台保存本地数据的工具,用于保存一些常用配置。

二、SharedPreferences
1.类似Map集合,将Key-Value对存储于硬盘上的XML文件,以XML文件的形式保存在/data/data/包名/shared_prefs目录下。数据较多时会有性能问题。
2.SharedPreferences适用于简单数据的存储,对于复杂且相互间有关的数据,则更适合保存在数据库。
3.支持基本数据类型和StringSet类型数据的存储。
4.SharedPreferences保存在APP内部,当手动清除应用数据时,保存的数据会被清除掉。
5.类似于Windows系统上的ini配置文件,但具有权限设置:Context.MODE_PRIVATE(只能被本应用访问),Context.MODE_APPEND(追加模式),Context.MODE_WORLD_READABLE(其他应用可读),Context.MODE_WORLD_WRITEABLE(其他应用可写)。
6.ContextImpl 记录着 SharedPreferences的重要数据、文件路径和实例的键值对。
7.在 XML 文件全部内加载到内存中之前,读取操作是阻塞的。在 XML 文件全部内加载到内存中之后,是直接读取内存中的数据。
8.apply() 是异步的所以没有返回值, 而commit()是同步的且有返回值因而能知道修改是否成功。
9.多并发的提交 commit() 时,需等待正在进行的 commit ()数据更新到磁盘文件后才会继续往下执行,从而降低效率。 而 apply ()只是原子更新到内存,后调用 apply ()函数会直接覆盖前面内存数据,从而一定程度上很大的提高了效率。
10.不是线程安全的。
11.不自带加密功能。
12.不自带多进程共享,除非通过自定义ContentProvider等方式实现,但实现复杂且性能低下。

三、MMKV
1.基于Key-Value存储的跨平台通用数据持久化库,基于mmap(内存映射文件),适用于Android、iOS、macOS、Linux和Windows平台。
2.设计初衷是为了解决传统SharedPreferences在数据量较大时读写效率低下的问题,并提供比SQLite更简单和更高性能的API。
3.通过内存映射文件mmap(Memory Mapped File)存储Key-Value对和高效的编解码算法,将数据直接映射到内存中,避免了数据的序列化和反序列化过程,实现了极高的读写性能。
4.只将数据映射到内存中,不需要将数据全部读入内存,内存占用较低。
5.底层序列化和反序列化使用Protobuf实现,性能高且稳定。
6.支持常用数据类型及byte[]、StringSet、实现了Parcelable/Serializable接口的类型等数据类型的存取。
7.支持对存储内容进行加密(AES加密机制)。
8.特别适合于需要频繁读写大量数据且对性能要求较高的场景,非常适合于替代Android中的SharedPreferences和iOS中的NSUserDefaults。
9.支持多线程操作,是线程安全的,底层使用了锁机制。
10.支持多进程共享且效率较高,提供了进程锁来保证数据一致性。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

;