当前位置:首页 >综合 >用RxJava快速获取海量数据 只要每次都请求网络就可以了

用RxJava快速获取海量数据 只要每次都请求网络就可以了

2024-06-28 19:24:39 [百科] 来源:避面尹邢网

用RxJava快速获取海量数据

作者:小鄧子 移动开发 试想,速获需要一些动态数据的取海时候,只要每次都请求网络就可以了。量数但是速获,更有效率的取海做法是,把联网得到的量数数据,缓存到磁盘或内存。速获

试想,需要一些动态数据的量数时候,只要每次都请求网络就可以了。速获但是取海,更有效率的量数做法是,把联网得到的速获数据,缓存到磁盘或内存。取海

用RxJava快速获取海量数据 只要每次都请求网络就可以了

具体的量数说,计划如下:

用RxJava快速获取海量数据 只要每次都请求网络就可以了

  1. 偶尔的联网操作,只为获取***数据。

    用RxJava快速获取海量数据 只要每次都请求网络就可以了

  2. 尽可能快的读取到数据(通过获取之前缓存的网络数据)。

我将通过使用 RxJava,来实现这个计划。

基本模式

为每一个数据源(网络,磁盘和内存)创建Observable<Data>,使用concat()和first()操作符,构造一个简单的实现方式。

concat()操作符持有多个Observable对象,并将它们按顺序串联成队列。 first()操作符只从串联队列中取出并发送***个事件。因此,如果使用concat().first(),无论多少个数据源,只有***个事件会被检索出并发送。

  1. // Our sources (left as an exercise for the reader) 
  2. Observable<Data> memory = ...;   
  3. Observable<Data> disk = ...;   
  4. Observable<Data> network = ...; 
  5.  
  6. // Retrieve the first source with data 
  7. Observable<Data> source = Observable   
  8.   .concat(memory, disk, network) 
  9.   .first(); 

这种模式的关键在于concat()操作符只有需要数据的时候才会订阅所有的Observable数据源。由于first()操作符会较早的停止检索队列,所以,如果存在缓存数据,就没有必要访问较慢的数据源。 也就是说,如果memory返回结果,就不必担心disk和network会被访问。相反地,如果内存和磁盘都没有数据,才执行网络请求。

注意concat()所持有的Observable数据源,是按照一个接一个的顺序被检索的。

持久化数据

很明显,下一步是缓存数据。如果不把网络请求后的结果缓存到磁盘,磁盘访问后的结果缓存到内存,那么这根本不就不叫缓存。接下来要写的代码就是,网络数据的持久化操作。

我的解决方案是,让每个数据源在发送完事件后,都保存或者缓存数据。

  1. Observable<Data> networkWithSave = network.doOnNext(new Action1<Data>() {  
  2.  @Override public void call(Data data) {  
  3.  saveToDisk(data); 
  4.  cacheInMemory(data); 
  5.  } 
  6. }); 
  7.  
  8.  Observable<Data> diskWithCache = disk.doOnNext(new Action1<Data>() {  
  9.  @Override public void call(Data data) {  
  10.   cacheInMemory(data); 
  11.  } 
  12. }); 

现在,如果你使用networkWithSave和diskWithCache,数据将会在加载后自动保存。

(这個策略的另一个优势在于networkWithSave和diskWithCache可以在任何地方被使用,不局限于我们的多数据模式下。)

陈旧的数据

不幸的,现在我们保存数据的那些代码,执行的有点过头了。无论数据是否过时,它总是返回相同的数据。我们希望做到,偶尔连接服务器抓取***的数据。

解决方法在于,使用first()操作符进行过滤。就是设置它拒绝接收毫无价值的数据。

  1. Observable<Data> source = Observable 
  2.     .concat(memory, diskWithCache, networkWithSave) 
  3.     .first(new Func1<Data, Boolean>() {  
  4.       @Override public Boolean call(Data data) {  
  5.         return data.isUpToDate(); 
  6.       } 
  7.     }); 

现在,我们只需要发送被断定为***数据的事件就OK了。因此,只要有一个数据源的数据过期,就继续检索下一个数据源,直到找到***数据为止。

first()和takeFirst()操作符的比较

对于这种设计模式,first()和takeFirst()操作符可以二选其一。

两种调用方式的区别在于,如果所有数据源的数据均过期,没有任何的有效数据作为事件发送,first()会抛出NoSuchElementException异常(译者注:first()操作符均 return false),而takeFirst()操作符则直接调用完成操作,不会抛出任何异常。

使用哪个操作符,完全取决于是否需要明确处理缺失的数据。

代码示例

可以从这里检出,以上所有代码的实现示例:https://github.com/dlew/rxjava-multiple-sources-sample。

如果需要一个真实示例,检出 Gfycat App,它在获取数据的时候使用了这种模式。项目并没有使用以上展示的所有功能(因为不需要),但是,示范了concat().first()的基本用法。

责任编辑:倪明 来源: 简书 rxjava数据

(责任编辑:休闲)

    推荐文章
    • ICE油菜籽继续上涨 加拿大油菜籽市场涨幅超过美国市场

      ICE油菜籽继续上涨   加拿大油菜籽市场涨幅超过美国市场周一,洲际交易所(ICE)的加拿大油菜籽期货市场收盘上涨,延续数月来的上涨趋势。截至收盘,5月期约收高10.30加元,报收796.10加元/吨;7月期约收高10加元,报收755.60加元/吨;11月期 ...[详细]
    • 企业如何寻找优秀硬盘的新标准

      企业如何寻找优秀硬盘的新标准企业如何寻找优秀硬盘的新标准作者:Harris编译 2019-08-09 16:35:01存储 存储设备 在评估企业的最佳硬盘时,容量和价格很重要,但预期目的可能更重要。几十年来,企业购买最好的硬盘的 ...[详细]
    • Redis 原理及混合持久化

      Redis 原理及混合持久化Redis 原理及混合持久化作者: 小汪哥 2021-10-04 21:11:18存储 存储软件 Redis redis 是单线程程序的,除了 Redis 之外,Node.js 也是单线程,Ngi ...[详细]
    • 工作日志,多租户模式下的数据备份和迁移

      工作日志,多租户模式下的数据备份和迁移工作日志,多租户模式下的数据备份和迁移作者:itdragon 2019-08-01 15:47:25存储 存储软件 记录和分享一篇工作中遇到的奇难杂症。目前做的项目是多租户模式。一套系统管理多个项目, ...[详细]
    • 非卖品明码标价摆上架 质量问题谁负责?

      非卖品明码标价摆上架  质量问题谁负责?原本作为样品给消费者使用和体验的化妆品试用装,竟成为时下不少商家开展单独销售的一门生意。HARMAY话梅、THE COLORIST调色师等新兴美妆集合店内,种类丰富、价格低廉的化妆品小样吸引年轻人排起 ...[详细]
    • 关于多写入点数据库集群的一些想法

      关于多写入点数据库集群的一些想法关于多写入点数据库集群的一些想法作者:佚名 2021-09-07 10:12:25数据库 在分布式数据库系统领域, 多主(多写入点, Leader-less)是一个非常诱人的特性, 因为客户端可以随机 ...[详细]
    • 李楠评价小米10:价格不会便宜

      李楠评价小米10:价格不会便宜日前,有网友在知乎提问“如何评价即将在2020.2.13发布的小米10系列?有哪些亮点和槽点?”,魅族前副总裁李楠发表了自己的看法。李楠表示,小米10有两个亮点值得让人期待,分别是“对游戏的支持”以及 ...[详细]
    • 存储设备在边缘计算的5个设计注意事项

      存储设备在边缘计算的5个设计注意事项存储设备在边缘计算的5个设计注意事项作者:佚名 2019-08-01 11:11:31存储 边缘计算 在过去的五年中,全球正在生成、使用、传输数据,存储的数据量十分庞大。预计5G将带来无法预料的网络能 ...[详细]
    • 又现理财产品提前终止 “资管新规”过渡期倒计时

      又现理财产品提前终止 “资管新规”过渡期倒计时“资管新规”过渡期仅剩58天,银行理财净值化转型也在火热持续中。北京商报记者11月3日注意到,近日,民生银行旗下有60余款理财产品拟提前终止。而在民生银行之前,华夏银行、郑州银 ...[详细]
    • 2021年比较值得投资的7种数据科学技能

      2021年比较值得投资的7种数据科学技能2021年比较值得投资的7种数据科学技能作者:MarTechCareer 2021-01-07 17:11:16大数据 数据分析 在2021年伊始,Google数据与分析主管、NVIDIA工程部高级总 ...[详细]
    热点阅读