Tuke——基于 ObjectStream的 key-value 存储组件

写在开头:感谢ZXHHYJ对Tuke的技术支持

Tuke 是基于 ObjectStream的 key-value 存储组件,稳定性强,使用方便。从 2019 年至今在我个人的软件上使用,在经过了3年的磨练,我写出了Tuke3.0版本,现在一起阅读使用说明吧!

ps:下文使用ObjS替代ObjectStream

为什么不使用SharedPerference和MMKV

传统的SharedPerference的诟病已为人熟知,这里不再列举。早在17年,腾讯就推出了更高性能的MMKV组件,其数据储存的方法是增量更新,但因为使用的二进制结构原因,导致了文件只能增不能减。同时,linux内核的mmap虽是高效的,但也是不稳定的,举个例子:有一个极大的数据,数据写一半的时候突然进程崩溃或者被杀死。那当你再次读取数据的时候会发现所有数据均已丢失。

为什么使用ObjStream

安卓上的Objs使用的是既传统又不传统的I/O操作,他的效率比其他java平台高。当你深入追踪安卓的I/O操作后,你会发现安卓已经对java原始的I/O操作进行了改动,这也是为什么我说他是既传统有不传统的I/O。同时,如果你不喜欢使用安卓的I/O,Tuke可以很轻松的修改,这将会在下文的进阶用法2中提及。

Tuke 简介

  • 数据组织
    Tuke采用一个键对应一个文件,文件内储存值。即linux的万物均是文件的思想。

  • 读写优化

    Tuke提供了一个全局的缓存策略,还提供接口允许开发者使用自己的缓存策略。当写入或读取一个文件时,会记录操作的时长,以此作为缓存重要性的依据,Tuke内部使用了lruCache,当缓存的大小超过13*60ms的时候,将会回收使用最少,最不频繁的值。

  • 语法糖
    Kotlin提供的丰富的语法,by作为其中的一员,可以代理属性的读写。利用它,TukeKtx实现了对属性的自动保存和恢复。

Android指南

安装引入

Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:

 allprojects {repositories {...maven { url 'https://jitpack.io' }}}

Step 2. Add the dependency

 dependencies {implementation 'com.gitee.simon9102:tuke:1.0.0'}

快速上手

Tuke分为全局储存和分区储存。

下述介绍全局储存

当使用全局储存的时候,需要进行初始化

Tuke.init(Context)
//or
Tuke.init(Tuke.Config)

使用Context作为参数时,Tuke会把data/data/包名/no_backup作为储存位置,同时使用全局缓存,并记录读写出现的异常(tukeError:xxxxxxxx);(w)

使用Config作为参数时,开发者可以在Config实例化时传入储存位置和数据库名称,并可以链式添加异常记录器和缓存策略

读写删操作

Tuke.tukeWrite(String key,Object value);
Tuke.tukeGet(String key, Object def, boolean useMemory);
//其中 get方法的def和useMemory是可选参数
Tuke.tukeRemove(String key);
Tuke.tukeRemoveAll();

下述介绍分区储存

使用分区储存时,需要new一个Tuke实例

Tuke tuke=new Tuke(Tuke.Config);

读写删操作

ps:下文中tuke不是Tuke,tuke是一个对象,Tuke是类

tuke.write(String key,Object value);
tuke.get(String key, Object def, boolean useMemory);
//其中 get方法的def和useMemory是可选参数
tuke.remove(String key);
tuke.removeAll();

进阶用法

用法1:使用TukeKtx组件,以通过代理变量实现自动储存读取

使用

var cookie: String by tuke(def: V?,key: String?,useMemory: Boolean,config: Tuke.Config?)

by tuke()提供4个参数,每个参数均可以省略。下介绍参数详解

参数 介绍
def 取不到值时的默认值,若未使用此参数,默认null
key tuke取值使用的键,若未设置此参数,默认 “当前类名.字段名”
useMemory 是否使用缓存,若未设置此参数,默认false
config 使用某个配置,若未设置此参数,默认全局储存

用法2:自定义储存方式

上文以述,开发者可以自行修改Tuke的源码以实现自己对性能/安全的需求。

Tuke最终的I/O操作并非在Tuke类,而是交给TukeImpl实现的,开发者可以自己修改内部write/get的Stream。

问题 & 反馈

如果你遇到了问题,并且想联系我,欢迎提issues。

三年沉淀,Tuke3发布相关推荐

  1. 广东实施《粤港澳大湾区规划纲要》三年计划近期发布

    中新社广州1月29日电 (索有为 程景伟)广东省发展改革委主任葛长伟1月29日在广东省十三届人大二次会议专场记者会上透露,广东省实施<粤港澳大湾区规划纲要>的实施意见和三年行动计划将在近期 ...

  2. ❤️大学三年沉淀,把我的学习经验分享给你,爆肝万字带你走进编程世界!❤️

    Hello,大家好,我是Alex.时光匆匆,暑假过的很快,转眼又到了大学的开学季,我也是又混进了我们学院的新生群,发现大家对计算机充满着迷之向往,啊哈哈哈,不过没有人带着入门还是很容易走弯路的哦,今天 ...

  3. Rust 1.0发布一周年,发展回顾与总结

    本文为InfoQ中文站特供稿件,首发地址为: http://www.infoq.com/cn/articles/anniversary-of-the-release-of-rust-1 .如需转载,请 ...

  4. 华为否认今年将推出搭载鸿蒙系统手机;苹果或在 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  5. 10月14日科技资讯|华为折叠屏手机月底或开卖;苹果计划 3 年内推出 5G 基带芯片;Node.js 12.12.0 发布 | 极客头条

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...

  6. 8月发布的小米MIX4有什么优缺点

    国内手机市场的快速发展,高端机型层出不穷,上个月小米官方发布的MIX4科技感十足,距离上一代mix3发布接近三年,mix4发布已经半个多月,今天聊聊他的优缺点. 小米MIX4的正面是一块没有任何挖孔的 ...

  7. 深度学习原来还可以这么学!

    最近身边很多朋友在讨论人工智能,讨论人工智能在我们生活中的应用,随之而来就开始讨论深度学习技术,但是由于深度学习的涉及面比较广,对数学的要求比较高,所以想学也不太敢学,生怕认真学了却没学会.其实可能还 ...

  8. 深度学习难,这本书让你轻松学深度学习

    深度学习在短短几年之内便让世界大吃一惊. 它非常有力地推动了计算机视觉.自然语言处理.自动语音识别.强化学习和统计建模等多个领域的快速发展. 随着这些领域的不断进步,人们现在可以制造自动驾驶的汽车,基 ...

  9. 隐私与AI兼得,蚂蚁金服是如何做到的?

    蚂蚁金服在过去十五年重塑支付改变生活,为全球超过十二亿人提供服务,这些背后离不开技术的支撑.在 2019 杭州云栖大会上,蚂蚁金服将十五年来的技术沉淀,以及面向未来的金融技术创新和参会者分享.我们将其 ...

最新文章

  1. 如何在Mac OS X上启动PostgreSQL服务器?
  2. [云炬创业基础笔记]第一章创业环境测试1
  3. Google调查了人们过去24小时的观看记录,发现了这些......
  4. Character中的奇葩
  5. 微信小程序下拉刷新/上拉加载更多
  6. Visual Studio 2017新版发布,极大提高开发效率丨附下载 1
  7. 【学习笔记】数据链路层——轮询访问介质控制(轮询协议、令牌传递协议)
  8. 蚊子132谈IT团队工作的态度和技巧
  9. openssl生成证书
  10. 路由器POS接入方式
  11. 滚动模式_违停车辆有可能被强制拖车!嘉兴交警开启滚动式兵团化作战模式
  12. 车间调度建模系列8|扩展析取图之基于时间片段的赋时三维析取图模型
  13. Must specify unique android:id, android:tag, or have a parent with an id for 异常
  14. UDS常用诊断服务介绍
  15. SD-WAN、MPLS 、IPsec 和物理专线的区别
  16. 【已经解决】网页按F12转开发者模式,看不到请求头Headers信息
  17. 使用Kettle读取Excel文件中的数据,存储在MySQL中
  18. LeetCode——跳跃游戏
  19. autocad2014 转pdf并保存多页
  20. SecureCRT常用文件操作命令

热门文章

  1. Java实现发邮件功能
  2. java/php/net/python中小型培训机构管理系统设计
  3. 一款好看的404页面代码 | 滚动的404
  4. 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法
  5. 报错:libpng warning: iCCP: cHRM chunk does not match sRGB解决办法
  6. 通过经纬度坐标计算距离
  7. Squirrel中的类与实例
  8. SpringBoot模拟单点登录
  9. 不要盲目跟风,看微信营销适合哪些行业
  10. Linux 误删文件恢复命令及方法!