| English
FastKV是用Java编写的高效可靠的key-value存储库。
FastKV有以下特点:
dependencies {
implementation 'io.github.billywei01:fastkv:2.6.0'
}
FastKVConfig.setLogger(FastKVLogger)
FastKVConfig.setExecutor(Dispatchers.Default.asExecutor())
初始化可以按需设置日志接口和Executor。
// FastKV kv = new FastKV.Builder(context, name).build();
FastKV kv = new FastKV.Builder(path, name).build();
if(!kv.getBoolean("flag")){
kv.putBoolean("flag" , true);
}
int count = kv.getInt("count");
if(count < 10){
kv.putInt("count" , count + 1);
}
Builder的构造可传Context或者path。
如果传Context的话,会在内部目录的'files'目录下创建'fastkv'目录来作为文件的保存路径。
FastEncoder<?>[] encoders = new FastEncoder[]{LongListEncoder.INSTANCE};
FastKV kv = new FastKV.Builder(context, name).encoder(encoders).build();
List<Long> list = new ArrayList<>();
list.add(100L);
list.add(200L);
list.add(300L);
kv.putObject("long_list", list, LongListEncoder.INSTANCE);
List<Long> list2 = kv.getObject("long_list");
除了支持基本类型外,FastKV还支持写入对象。
如果要写入自定义对象,需在构建FastKV实例时传入对象的编码器(实现了FastEncoder接口的对象)。
因为FastKV实例加载时会执行自动反序列化,所以需要在实例创建时注入编码器。
另外,如果没有注入编码器,调用putObject接口时会抛出异常(提醒使用者给FastKV实例传入编码器)。
上面LongListEncoder就实现了FastEncoder接口,代码实现可参考:
LongListEncoder
编码对象涉及序列化/反序列化。
这里推荐笔者的另外一个框架:https://github.com/BillyWei01/Packable
如需对数据进行加密,在创建FastKV实例时传入 FastCipher 的实现即可。
FastKV kv = FastKV.Builder(path, name)
.cipher(yourCihper)
.build()
项目中有举例Cipher的实现,可参考:AESCipher
FastKV实现了SharedPreferences接口,并且提供了迁移SP数据的方法。
用法如下:
public class SpCase {
public static final String NAME = "common_store";
// 原本的获取SP的方法
// public static final SharedPreferences preferences = AppContext.INSTANCE.getContext().getSharedPreferences(NAME, Context.MODE_PRIVATE);
// 导入原SP数据
public static final SharedPreferences preferences = FastKV.adapt(AppContext.INSTANCE.getContext(), NAME);
}
由于MMKV没有实现 'getAll' 接口,所以无法像SharePreferences一样一次性迁移。
但是可以封装一个KV类,创建 'getInt','getString' ... 等方法,并在其中做适配处理。
可参考:MMKV2FastKV
项目提供了支持多进程的实现:MPFastKV。
MPFastKV除了支持多进程读写之外,还实现了SharedPreferences的接口,包括支持注册OnSharedPreferenceChangeListener;
其中一个进程修改了数据,所有的进程都会感知(通过OnSharedPreferenceChangeListener回调)。
可参考 MultiProcessTestActivity
和 TestService
需要提醒的是,由于支持多进程需要维护更多的状态,MPFastKV 的写入要比FastKV慢不少, 所以在不需要多进程访问的情况下,尽量用 FastKV。
Kotlin是兼容Java的,所以Kotlin下也可以直接用FastKV或者SharedPreferences的API。
此外,Kotlin还提供了“委托属性”这一语法糖,可以用于改进key-value API访问。
可参考:KVData
测试结果如下:
更新:
25 | 50 | 100 | 200 | 400 | 600 | |
---|---|---|---|---|---|---|
SP-commit | 114 | 172 | 411 | 666 | 2556 | 5344 |
DataStore | 231 | 625 | 1717 | 4421 | 7629 | 13639 |
SQLiteKV | 192 | 382 | 1025 | 1565 | 4279 | 5034 |
SP-apply | 3 | 9 | 35 | 118 | 344 | 516 |
MMKV | 4 | 8 | 5 | 8 | 10 | 9 |
FastKV | 3 | 6 | 4 | 6 | 8 | 10 |
查询:
25 | 50 | 100 | 200 | 400 | 600 | |
---|---|---|---|---|---|---|
SP-commit | 1 | 3 | 2 | 1 | 2 | 3 |
DataStore | 57 | 76 | 115 | 117 | 170 | 216 |
SQLiteKV | 96 | 161 | 265 | 417 | 767 | 1038 |
SP-apply | 0 | 1 | 0 | 1 | 3 | 3 |
MMKV | 0 | 1 | 1 | 5 | 8 | 11 |
FastKV | 0 | 1 | 1 | 3 | 3 | 1 |
每次执行Benchmark获取到的结果有所浮动,尤其是APP启动后执行多次,部分KV会变快(JIT优化)。
以上数据是取APP冷启动后第一次Benchmark的数据。
相关博客:
https://juejin.cn/post/7018522454171582500
由于提供给Android平台的版本和纯JDK的版本的差异越来越多,所以分开仓库来维护。
纯JDK版本的链接为:
https://github.com/BillyWei01/FastKV-Java
See the LICENSE file for license rights and limitations.