当缓存为空时如何进行数据库调用并将值设置为来自数据库的缓存?

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

我有一个缓存,database.I 正在从缓存中获取值。如果缓存中的数据为空(由于过期)。我正在调用数据库并从缓存中获取数据后。我会将数据库中的值设置到缓存中。

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

Single<String> getFromCache()  { // or should I use may be here
   //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()  { // or should I use may be here
   //return Maybe.just("cache");
   return Maybe.empty();
}

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

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

您快完成了,使用 switchIfEmpty 作为您的用例:

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