java - 当缓存为空并将值设置为从 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);
}
解决方案
您几乎完成了,switchIfEmpty
用于您的用例:
Single<String> get() {
return getFromCache()
.switchIfEmpty(getFromDatabase().doOnSuccess(this::setDatabase));
}
推荐阅读
- python - Ursina 中的 Perlin 噪声
- c# - OnCollisionEnter2D 未调用
- python - 无法使用烧瓶 sqlalchemy python 应用从 Google 应用服务中的 Google Cloud sql 获取 sql db 数据
- javascript - 将内部对象转换为外部对象的属性
- python - 努力创建一个字典来存储来自 IBM Watson Entity Analysis 的结果
- c# - 使用 WPF C# 将我的 SQL 数据库导出为 XML
- spring-boot - 具有自定义查询的 Spring Data Pageable,如果限制大于元素数,则返回零个对象
- python - 如何评估用字符串填充的矩阵?
- c# - 返回 BigInteger 值的问题 c#
- javascript - 使用 JavaScript 或 CSS 制作形状并为其设置动画