当缓存为空时,我如何进行数据库调用,并将值从数据库设置到缓存中?

huangapple go评论73阅读模式
英文:

how do I make a db call when cache is empty and set value to cache from db?

问题

以下是您提供的内容的翻译部分:

我有一个缓存和一个数据库。我正在从缓存中获取值。如果缓存中的数据为空(因为已过期),我会从数据库中获取数据,并在从缓存中获取数据后,将值从数据库设置到缓存中。

Single<String> get() {
    return getFromCache().onErrorResumeNext(getFromDatabase());
}

Single<String> getFromCache()  {
    //return Single.just("cache");
    return Single.error(new Exception("exception"));
}

Single<String> getFromDatabase() {
    return Single.just("database");
}

Single<String> setDatabase(Single<String> val) {
    return val.map(
            v -> {
                String res = v;
                System.out.println(res);
                return res;
            }
    );
}

在这里,如果从缓存中获取的值为空,我可以调用数据库,但是接下来我无法调用 setDatabase 方法。

------------ 我已经找到了解决方法 ---------------------------

由于我对 RxJava 不太了解,我想知道最佳解决方法是什么。

Single<String> get() {
    Observable<String> cacheObservable = getFromCache().toObservable();
    Observable<String> databaseObservable = getFromDatabase().toObservable();

    Single<String> result = Observable.concat(cacheObservable, databaseObservable).firstOrError();

    databaseObservable.doOnNext(val -> {
        setDatabase(val);
    });
    return result;
}

Maybe<String> getFromCache()  {
   //return Maybe.just("cache");
   return Maybe.empty();
}

Single<String> getFromDatabase() {
    return Single.just("database");
}

void setDatabase(String res) {
    System.out.println(res);
}

请注意,我只翻译了您提供的代码部分,其他部分均被忽略。如果您有任何进一步的问题或需要更多的帮助,请随时提问。

英文:

I have a cache and a database.I am fetching value from cache. if data from cache is empty (due to expiration). I am making a call to database and after fetching data from cache. I will set the value from database to cache.

Single&lt;String&gt; get() {
    return getFromCache().onErrorResumeNext(getFromDatabase());
}

Single&lt;String&gt; getFromCache()  { // or should I use may be here
   //return Single.just(&quot;cache&quot;);
    return Single.error(new Exception(&quot;exception&quot;));
}

Single&lt;String&gt; getFromDatabase() {
    return Single.just(&quot;database&quot;);
}

Single&lt;String&gt; setDatabase(Single&lt;String&gt; val) {
    return val.map(
            v -&gt; {
                String res = v;
                System.out.println(res);
                return res;
            }
    );
}

Here I am able to call database if value from cache is empty but then I am not able to call method setDatabase.

------------ I have found this way to solve it---------------------------
Since I am new to rxjava. I wanted to what is best way to solve this

Single&lt;String&gt; get() {
    Observable&lt;String&gt; cacheObservable = getFromCache().toObservable();
    Observable&lt;String&gt; databaseObservable = getFromDatabase().toObservable();

    Single&lt;String&gt; result = Observable.concat(cacheObservable, databaseObservable).firstOrError();

    databaseObservable.doOnNext(val-&gt; {
        setDatabase(val);
    });
    return result;
}

Maybe&lt;String&gt; getFromCache()  { // or should I use may be here
   //return Maybe.just(&quot;cache&quot;);
   return Maybe.empty();
}

Single&lt;String&gt; getFromDatabase() {
    return Single.just(&quot;database&quot;);
}

void setDatabase(String res) {
    System.out.println(res);
}

答案1

得分: 0

你几乎完成了,针对你的用例使用switchIfEmpty

Single<String> get() {
    return getFromCache()
            .switchIfEmpty(getFromDatabase().doOnSuccess(this::setDatabase));
}
英文:

You were almost done, use switchIfEmpty for your use case :

Single&lt;String&gt; get() {
        return getFromCache()
                .switchIfEmpty(getFromDatabase().doOnSuccess(this::setDatabase));
    }

huangapple
  • 本文由 发表于 2020年10月26日 16:04:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/64533379.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定