0

我想了解如果我緩存返回一個冷的Observable的方法的結果會發生什麼?該流尚未實現,那麼緩存實際上包含了什麼?我試圖找出使用Hazelcast和Spring Boot,但無法使緩存工作。如何緩存像Observable這樣的被動式發佈者?

編輯: 當我說緩存不工作時,基於我從Hazelcast管理中心看到的情況發言。根據緩存配置(我嘗試了很多事情),緩存顯示但沒有條目,或緩存根本不顯示。

實施例:

@javax.cache.annotation.CacheResult 
Observable<Integer> random() { 
    // Do I get a new number every time? 
    return Observable.just(new Random().nextInt()); 
} 
+0

「無法獲得緩存工作」是什麼意思? – Enigmativity

+0

@Enigmativity請參閱編輯。 –

回答

1

從RX-java的維基(源here):

冷可觀測發射項目的特定序列,但是可以開始 當其觀察發現發射該序列它很方便,無論觀察者需要什麼速率,都不會中斷序列的完整性。例如,如果您將靜態的 Iterable轉換爲Observable,則該Observable將發出相同的 項序列,無論它在何時被訂閱,或者如何頻繁觀察這些項目 。由一個 cold Observable發出的項目示例可能包括數據庫查詢的結果,文件 檢索或Web請求。

隨着冷Observable,喜歡你的例子,該請求在訂閱時,每個用戶來完成。即使沒有緩存,如果您同時訂閱兩次Observable,請求將發生兩次。 Observable未綁定到特定的流。 Observable只是一個描述如何訪問數據的合約。

緩存方法的結果返回Observable我覺得有點類似於將結果存儲到本地屬性;您只需避免稍後重新創建Observable對象。但只是'吸氣',而不是數據。

rx-java給出一些工具來實現它自己的緩存。你可以看看SubjectConnectableObservable

+0

所以,你的答案的關鍵是'Observable'不能用傳統的方法緩存。我有沒有得到那個權利? –

+0

我不知道所有這些方法,但大多數方法都會緩存Observable,但不會流過它,是的。 –

+0

@AbhijitSarkar - 可觀測值可以正常緩存,但可觀測值與可觀測值產生的值不同。只有當你有觀察者和訂閱時纔會發生這種情況。 – Enigmativity