MMKV组件实现原理以及和SharedPreferences的比较(二)
2019-07-09 19:50
901 查看
MMKV数据结构
- 上面提到的SharedPreferences使用的是xml来进行文件存储的
<map> <int name = "4970" value="4970"/> <int name = "4971" value="4971"/> <int name = "4972" value="4972"/> <int name = "4973" value="4973"/> <int name = "4974" value="4974"/> <int name = "4975" value="4975"/>
-
而MMKV的数据结构是:
将这个数据结构保存为MMKV.default文件,总长度为4字节
使用这种数据结构的原因:
- 全是数字表示,直接将xml中的多余部分省略,数据量越小,操作的速度越快
- key和value的长度可以为1~5个字节
如何做到key和value长度为1~5个字节
- 使用变长编码
变长编码实现原理:
- 底层序列化和反序列化使用protobuf实现,性能高,稳定性强
- 数据量表示会比JSON和xml小很多
- 编码示例:
进制 | 数值 |
---|---|
16进制 | 0x7f |
10进制 | 127 |
2进制 | 0111 1111 |
- 写入: 0111 1111
进制 | 数值 |
---|---|
16进制 | 0x80 |
10进制 | 128 |
2进制 | 1000 0000 |
-
写入:0000 0001
-
计算写入值的方式:
机组中的变长编码将第一位设置为标志位:表示符号 - 比如:1000 0000
- 1.去掉符号位剩下 000 0000 一会放到结果的后面
- 2.将1000 0000 右移7位得到 0000 0001
- 3.0000 0001去掉第一位的符号位得000 0001 一会放到结果的前面
- 4.结果:0000 0000 1000 0000
写入方式:增量写入
- 不管key是否重复,直接将数据追加在前数据后面即可
解决文件越来越大的问题:
全量写入:当文件大小不够,需要进行全量写入,将数据去掉重复key之后,如果文件大小满足写入的数据大小,则可以直接更新全量写入,否则需要扩容(根据平均每个K-V大小计算未来可能需要的文件大小来进行扩容,防止经常性全量写入)
- 去重的工作交给map去做即可,如果一直提交数据没有重复的数据就需要将进行扩容
MMKV的优势
- mmap防止数据丢失,提高读写效率
- 精简数据,以最少的数据量表示最多的信息,减少数据的大小
- 增量更新,避免每次进行相对增量来说数据量的全量写入
Android中实现MMKV
extern "C" JNIEXPORT void JNICALL Java_com_wjx_android_mymmkv_MMKV_writeTest(JNIEnv *env, jobject instance) { std::string file = "/sdcard/wjx.txt"; m_fd = open(file.c_str(), O_RDWR | O_CREAT, S_IRWXU); m_size = getpagesize(); ftruncate(m_fd, m_size); m_ptr = (int8_t *) mmap(0, m_size, PROT_READ |PROT_WRITE, MAP_SHARED, m_fd, 0); std::string data("wjx"); //将data的data.size()个数据拷贝到m_ptr memcpy(m_ptr, data.data(), data.size()); } extern "C" JNIEXPORT jstring JNICALL Java_com_wjx_android_mymmkv_MMKV_readTest(JNIEnv *env, jobject instance) { char *buf = static_cast<char *>(malloc(33)); memcpy(buf, m_ptr, 33); std:string result(buf); munmap(m_ptr, m_size); close(m_fd); }
相关文章推荐
- HashMap底层实现原理,以及和Hashtable的比较
- react-redux高阶组件connect方法使用介绍以及实现原理
- Android 四大组件之(2)Service实现原理以及AIDL语言的使用详解
- Android 四大组件 Service实现原理以及AIDL语言的使用详解
- (11) java集合 ---- LinkedHashMap和HashMap等Map的比较使用以及 LinkedHashMap的实现原理
- TCP/IP原理、基础以及在Linux上的实现(转)
- 前端分页功能的实现以及原理(jQuery)
- Mybatis原理,优缺点,以及与Hibernate的比较
- android 图片自定义三级缓存实现以及原理、图片错位解决
- Canny算子边缘检测原理以及实现
- 智能指针的实现--使用引用计数实现以及原理
- SAMBA 的实现原理以及使用方法
- 扒一扒 ReentrantLock 以及 AQS 实现原理
- paip.;论全文检索实现方式lucene Sphinx solr以及比较
- 转: 常见加密算法分,用途,原理以及比较
- 用Delphi为Asp开发文件上载组件的原理和具体实现过程
- java 二维码原理以及用java实现的二维码的生成、解码
- 上传组件的比较,FileUpload组件的原理
- 聊聊keep-alive组件的使用及其实现原理
- PCA原理以及算法实现