2015-11-30 71 views
21

我有一個應用程序使用同步API來獲取其數據,並且需要本地存儲所有數據。 數據集本身非常大,我不願將它存儲在內存中,因爲它可以包含數千條記錄。由於我不認爲實際的數據結構是相關的,我們假設我正在構建一個需要脫機訪問的電子郵件客戶端,並且我希望我的存儲機制是IndexedDB(它是異步的)。如何將Redux與非常大的數據集和IndexedDB集成

我知道一個簡單的解決方案是將數據結構作爲我的狀態對象的一部分,並且只填充所需數據的狀態(例如 - 在觸發EMAIL_OPEN操作時將電子郵件內容存儲到狀態)。這非常簡單,尤其是在使用減號的情況下。

然而,這將意味着我需要妥協兩件事情:

  1. 的用戶數據是「應用程序狀態」的不再是一部分,但事實上它是。由於同步行爲非常複雜,因此將其從應用程序狀態機中刪除將會損害REDX概念的優雅性(我瞭解它們的方式)
  2. 我真的很喜歡REDX體系結構,並希望我的所有邏輯都能通過它,而不僅僅是視圖狀態。

有沒有關於如何使用redux與內存不足狀態屬性的最佳做法?我覺得最難纏的東西是,redux依賴於同步API,所以我無法用異步狀態對象替換狀態對象(除非我完全刪除了redux並將其替換爲我自己的異步實現和連接器)。

我找不到使用Google的答案,但是如果已經有關於此主題的良好資源,我希望能夠指出這一點。

UPDATE: 問題得到回答,但希望提供更好的植到我是如何實現它,萬一有人跑進去:

主要想法是維護使用簡單終極版客戶端和服務器的更改列表減速機,並使用連接器來聽這些改變列表更新IDB,也與客戶的變化來更新服務器:

  1. 當客戶端進行更改,請使用減速器來更新客戶端的改變列表。
  2. 服務器發送更新時,使用reducer更新服務器更改列表。
  3. 連接器偵聽存儲,並在狀態更改時更新IDB。還維護修改過的項目的內部列表。
  4. 更新服務器時,使用修改項目列表從IDB中提取delta併發送到服務器。
  5. 訪問數據時,使用正常的行爲與IDB拉(例如,使用終極版-的thunk)

這種方法唯一需要注意的是,因爲真正的狀態被存儲在IDB,所以我們失去了一些具有一個狀態對象的價值(也難以倒回/快進狀態)

+0

我沒有一個明確的答案,因爲很少有人知道和寫入存儲在redux狀態的大型數據集。我只是建議你試試看看redux&react是否可以處理內存中的負載。你可以寫一個相當簡單的測試場景,看它是否工作。 您可能還想使用像ImmutableJS這樣的庫,它可以優化存儲和變異數據存儲的效率。 希望這有助於某種方式。讓我知道它是如何去的。我對錶演很好奇。 – JensDebergh

+0

由於我想支持手機,我的記憶指紋不能太大。在許多設備上,JS的內存分配非常小,因此存儲大量數據只是一個非常糟糕的主意。 – AriehGlazer

回答

19

我認爲你的第一個預感是正確的。如果(!)不能在商店中存儲所有內容,則必須在商店中存儲較少的商品。但我相信我可以讓這個解決方案聽起來更好:

IndexedDB只是成爲另一個端點,就像您使用的任何服務器API一樣。當您從服務器獲取數據時,您將其轉發到IndexedDB,然後您的商店將從其中填充。只要商店不會太大或過時,商店就會得到所需的內容並緩存它。

它真的和Facebook所使用的API沒什麼不同。商店中沒有用戶的所有數據。引用通過ID實現,並在需要時加載。

你可以保持所有的邏輯在減少。只需像往常一樣爲用戶操作和數據更改創建操作,獲取所需的數據並對其進行處理。界面仍然完全由用戶數據定義,因爲您需要時總是需要在商店中獲取其餘部分所需的信息。這只是有點濃縮,我。即您只能保存郵件的總數或郵箱的ID,直到用戶導航到該郵箱。

相關問題