Rxjava 从服务器获取数据并在访问缓存时更新缓存

Posted

技术标签:

【中文标题】Rxjava 从服务器获取数据并在访问缓存时更新缓存【英文标题】:Rxjava fetch data from server and update cache when cache is accessed 【发布时间】:2021-09-08 03:19:51 【问题描述】:

我有一个用例,我需要从缓存中获取数据,然后使用来自服务器的数据更新缓存。这样,当我下次访问缓存时,它将获得更新的数据。我尝试使用 concat() 和 merge() 运算符来组合缓存和网络调用,但在客户端我只需要第一个值一旦发出缓存值,网络调用 observable 就会被释放。 下面是我正在使用的代码,有没有更好的方法来实现这一点。目前我正在使用 doOnSuccess 方法进行订阅,这不是正确的方法。

class DataKit
    
    var cachedData: Data? = null
    
    fun getData(): Single<Data> 
     return if(cachedData != null)
             Single.just(cachedData)
                  .doOnSuccess 
                     getPinInfo()
                     .subscribeOn(schedulerProvider.io())
                     .subscribeBy(defaultErrorFun)
                   
        else getPinInfo()
    
    
    
    fun getPinInfo():Single<Data>
         api.getDataFromServer()
         .doOnSuccess cachedData = it
         .doOnErrorcachedData = null
    

【问题讨论】:

【参考方案1】:

我相信你可以在没有 if/else 条件的情况下将它写成 2 行作为一个序列:

   fun getData(): Single<Data> 
       return Maybe.fromOptional(Optional.ofNullable(cachedData))
            .switchIfEmpty(getPinInfo)

如果您还需要在缓存存在的情况下进行服务器调用,您可以使用flatMapSingle 运算符:

 .flatMapSingle getPinInfo 

但我不确定这是否有意义,我的意思是发出额外的请求只是为了更新缓存值。

如果您需要获取缓存值,然后使用从服务器接收到的值更新它,可以使用Flowable

【讨论】:

flatMapSingle getPinInfo 在这里无济于事,因为它会增加响应时间。

以上是关于Rxjava 从服务器获取数据并在访问缓存时更新缓存的主要内容,如果未能解决你的问题,请参考以下文章

varnish缓存服务

web前端缓存机制

Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取

12.查询缓存

高并发场景下使用缓存需要注意那些问题?

web技术分享| LRU 缓存淘汰算法