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

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

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

问题

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

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

  1. Single<String> get() {
  2. return getFromCache().onErrorResumeNext(getFromDatabase());
  3. }
  4. Single<String> getFromCache() {
  5. //return Single.just("cache");
  6. return Single.error(new Exception("exception"));
  7. }
  8. Single<String> getFromDatabase() {
  9. return Single.just("database");
  10. }
  11. Single<String> setDatabase(Single<String> val) {
  12. return val.map(
  13. v -> {
  14. String res = v;
  15. System.out.println(res);
  16. return res;
  17. }
  18. );
  19. }

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

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

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

  1. Single<String> get() {
  2. Observable<String> cacheObservable = getFromCache().toObservable();
  3. Observable<String> databaseObservable = getFromDatabase().toObservable();
  4. Single<String> result = Observable.concat(cacheObservable, databaseObservable).firstOrError();
  5. databaseObservable.doOnNext(val -> {
  6. setDatabase(val);
  7. });
  8. return result;
  9. }
  10. Maybe<String> getFromCache() {
  11. //return Maybe.just("cache");
  12. return Maybe.empty();
  13. }
  14. Single<String> getFromDatabase() {
  15. return Single.just("database");
  16. }
  17. void setDatabase(String res) {
  18. System.out.println(res);
  19. }

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

英文:

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.

  1. Single&lt;String&gt; get() {
  2. return getFromCache().onErrorResumeNext(getFromDatabase());
  3. }
  4. Single&lt;String&gt; getFromCache() { // or should I use may be here
  5. //return Single.just(&quot;cache&quot;);
  6. return Single.error(new Exception(&quot;exception&quot;));
  7. }
  8. Single&lt;String&gt; getFromDatabase() {
  9. return Single.just(&quot;database&quot;);
  10. }
  11. Single&lt;String&gt; setDatabase(Single&lt;String&gt; val) {
  12. return val.map(
  13. v -&gt; {
  14. String res = v;
  15. System.out.println(res);
  16. return res;
  17. }
  18. );
  19. }

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

  1. Single&lt;String&gt; get() {
  2. Observable&lt;String&gt; cacheObservable = getFromCache().toObservable();
  3. Observable&lt;String&gt; databaseObservable = getFromDatabase().toObservable();
  4. Single&lt;String&gt; result = Observable.concat(cacheObservable, databaseObservable).firstOrError();
  5. databaseObservable.doOnNext(val-&gt; {
  6. setDatabase(val);
  7. });
  8. return result;
  9. }
  10. Maybe&lt;String&gt; getFromCache() { // or should I use may be here
  11. //return Maybe.just(&quot;cache&quot;);
  12. return Maybe.empty();
  13. }
  14. Single&lt;String&gt; getFromDatabase() {
  15. return Single.just(&quot;database&quot;);
  16. }
  17. void setDatabase(String res) {
  18. System.out.println(res);
  19. }

答案1

得分: 0

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

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

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

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

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:

确定