首页 > 解决方案 > 当缓存为空并将值设置为从 db 缓存时,如何进行 db 调用?

问题描述

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

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);
}

标签: javacachingrx-java

解决方案


您几乎完成了,switchIfEmpty用于您的用例:

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

推荐阅读