React Query 的 StaleTime 與 gcTime:深入了解緩存管理
在 React Query 中,staleTime
和 gcTime
是兩個非常重要的選項,它們分別負責控制緩存數據的生命週期。了解它們的差異與作用,能幫助你更好地優化應用程序的性能,提升用戶體驗。
事件開頭短結論
staleTime
決定數據被視為「新鮮」的時間,而 gcTime
則決定數據在不再被使用後,在緩存中保留多久。簡單來說,staleTime
關乎數據是否需要重新獲取,而 gcTime
則關乎數據是否從緩存中移除。
事件重點
- staleTime (新鮮時間):設定數據保持「新鮮」的時間長度。在這個時間內,數據會從緩存中讀取,不會發送網絡請求。預設情況下,
staleTime
為 0,這表示數據一被獲取,就會被立即視為「過時」,需要重新獲取。你可以根據實際需求,將staleTime
設定為更長的時間,例如 30 秒、1 分鐘甚至更長,減少不必要的網絡請求。 - gcTime (垃圾回收時間):設定數據在不再被使用後,在緩存中保留的時間長度。當一個查詢不再被任何組件使用時,它會進入「非活動」狀態。
gcTime
決定了在「非活動」狀態下,數據會保留在緩存中的時間。預設情況下,gcTime
為 5 分鐘。當gcTime
到期後,數據將被標記為垃圾,並從緩存中移除,釋放內存。
深入解析:運作方式與應用場景
- staleTime 的作用:當你設置了
staleTime
,React Query 會檢查數據是否「新鮮」。如果數據「過時」(超過了staleTime
),React Query 會在後台重新獲取數據。即便數據過時,你的組件仍然會立即從緩存中讀取數據,提升用戶體驗。應用場景:如果你獲取的數據更新頻率較低(例如匯率、天氣預報),可以設置較長的
staleTime
,減少頻繁的網絡請求。 -
gcTime 的作用:當一個組件卸載,不再使用某個查詢的數據時,該查詢進入「非活動」狀態。
gcTime
決定了這些「非活動」的數據在緩存中保留的時間。當gcTime
到期後,數據將被從緩存中移除,釋放內存。應用場景:
gcTime
主要用於管理緩存大小和內存使用。你可以根據應用程序的內存限制和數據的更新頻率,調整gcTime
的值。如果你的應用程序需要處理大量數據,可以適當縮短gcTime
,避免緩存佔用過多內存。
綜合應用:如何搭配使用
- 數據更新頻率與 staleTime 的關係:如果數據更新頻率高,
staleTime
應該設置得較短,確保數據的準確性。如果數據更新頻率低,staleTime
可以設置得較長,減少不必要的網絡請求。 - 緩存大小與 gcTime 的關係:如果應用程序的內存有限,可以設置較短的
gcTime
,減少緩存佔用的內存。如果內存充足,可以設置較長的gcTime
,增加數據的重用性。
個人心得
理解 staleTime
和 gcTime
的概念非常重要。初期使用 React Query 時,很容易忽略這兩個選項,直接使用預設值。但在實際開發中,合理配置 staleTime
和 gcTime
,可以顯著提升應用程序的性能和用戶體驗。我建議大家根據具體的使用場景,仔細思考數據的更新頻率和內存限制,並適當調整這兩個參數。
總之,staleTime
和 gcTime
是 React Query 中非常重要的緩存管理選項。掌握它們的用法,可以幫助你構建更高效、更具響應性的 React 應用程序。
參考閱讀
- https://dev.to/thechaudhrysab/simple-understanding-of-gctime-staletime-in-react-query-35be
- https://medium.com/@bloodturtle/understanding-staletime-vs-gctime-in-tanstack-query-e9928d3e41d4
- https://stackoverflow.com/questions/72828361/what-are-staletime-and-cachetime-in-react-query
- https://github.com/TanStack/query/discussions/1685