PB 缓存数据指南

简介: ### 概述 在目前的支付宝客户端开发中, PB 格式已经是网络传输的序列化/反序列化方案的标配。但 PB 同时对我们 native 开发中的缓存实现也是有很大价值的。 ### 缓存方案对比 本人对比了如下几种客户端的缓存方案: * PB + DiskLruCache * Orml

概述

在目前客户端开发中, PB 格式已经是网络传输的序列化/反序列化方案的标配。但 PB 同时对我们 native 开发中的缓存实现也是有很大价值的。

缓存方案对比

本人对比了如下几种客户端的缓存方案:

  • PB + DiskLruCache
  • Ormlite/Sqlite
  • Gson + DiskLruCache

其中 PB + DiskLruCache 方案与 Gson + DiskLruCache 方案的性能对比如下:

07-25 16:51:51.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=35
07-25 16:51:51.429 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=110
07-25 16:51:51.439 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=10
07-25 16:51:51.489 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=45
07-25 16:52:11.229 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=29
07-25 16:52:11.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=87
07-25 16:52:11.319 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:52:11.329 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=6
07-25 16:53:46.259 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=36
07-25 16:53:46.329 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=72
07-25 16:53:46.339 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:53:46.339 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=5
07-25 16:54:14.159 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json write consume=39
07-25 16:54:14.249 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] json read consume=85
07-25 16:54:14.249 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb write consume=5
07-25 16:54:14.259 28287-28287/com.eg.android.AlipayGphone D/HomePresenter: [28287:main] pb read consume=5

实测数据:

json write pb write json read pb read
35 10 110 45
29 5 87 6
36 5 72 5
39 5 85 5

分项加总后:

json write pb write json read pb read
139 25 354 61

可以看出写操作,pb 所花时间仅占 json 的18%;读操作,pb 所花时间仅占 json 的17%。此外,OrmLite/Sqlite 在性能方面与 json 相当。

使用 PB 缓存的正确姿势

既然好处是明显的,我们看下如何应用这项新技巧,直接上代码:

QueryCommunityResp queryCommunityResp = ...; // 目标继承自 Message 的PB model 的实例

queryCommunityResp.toByteArray(); // 序列化

final Wire wire = new Wire();

try {
    QueryCommunityResp newResp = wire.parseFrom(queryCommunityResp.toByteArray(), 
            QueryCommunityResp.class); // 反序列化
} catch (IOException e) {
    // TODO: handle exception
}

别忘了添加 api 包依赖:

<dependency>
    <groupId>com.alipay.android.phone.thirdparty</groupId>
    <artifactId>wire-api</artifactId>
    <version>1.5.3</version>
    <scope>provided</scope>
 </dependency>
目录
相关文章
|
9月前
|
缓存 关系型数据库 MySQL
高性能内存对象缓存Memcached
高性能内存对象缓存Memcached案例
|
10月前
|
存储 SQL 缓存
缓存(4) —— 结构化缓存
缓存(4) —— 结构化缓存
57 0
|
缓存
封装计算缓存数据大小
封装计算缓存数据大小
56 0
封装计算缓存数据大小
|
存储 缓存 分布式计算
RDD 的缓存-缓存级别 | 学习笔记
快速学习 RDD 的缓存-缓存级别
272 0
RDD 的缓存-缓存级别 | 学习笔记
|
缓存 算法 中间件
如何无效化缓存-分布式缓存问题
  如何无效化缓存-分布式缓存问题   在过去的6年中,我一直参与构建中间件平台(wso2)。 我们大多数的客户部署都是群集,它们始终需要高可用性,有时还需要可伸缩性。   我们大多数服务器都是无状态的(也就是说,它们将状态保存在数据库中)。 我们的CEP服务器和邮件代理是两个值得注意的例外,但现在暂时将其忽略。   设置无状态服务器集群很容易(或者我们相信)。 我们设置服务器并放置一个负载均衡器(F5,HA Proxy,mod_proxy,Nginx)以分配负载。 不幸的是,我们还需要更多。 我们需要处理集群中服务器之间的安全性,会话,节流和工件部署。
221 0
|
存储 缓存 索引
LSM实现热数据读写和range查询加速
LSM-tree 上的读路径,从出生就带着镣铐。因为 CoW 的使用,读一条记录实际上需要把这条记录所有的增量碎片都找到。因为横跨内存和磁盘两种介质和有层次化的存储,这些碎片可能藏在各种犄角旮旯里面。更惨的是,如果是读一个范围内的记录,俗称 range scan,因为 LSM-tree 的每一层的 key range 是交叠的,那么一个 range 内的数据就很有可能会落在所有的层次上,为了把他们都找到,我们就需要每层都去读,这个工作量也不小。
277 0
|
SQL 存储 缓存
Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD、SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗?
Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
|
存储 SQL 缓存
内存KV缓存/数据库,可以选择它? | 1分钟系列
互联网业务,绝大部分场景,会使用缓存服务。
551 0