ReactQueryのキャッシュについて理解する

  • #開発
  • #NextJS
  • #React

こんにちは、CURUCURUエンジニアの水谷です。 最近Reactを学習し始めたのですが、その中でReactQueryについて沼った箇所があったので、ブログでまとめてみます。


ReactQueryについて

そもそもReactQueryとはについて書いておきます。 ReactQueryは、React hooksをベースにした状態管理のライブラリです。 ›ReactQuery ※今は名前が変わってTanStack Queryというらしいです。

ReactQueryは状態をクライアント側でキャッシュとして保持しておいて、サーバーとの通信負荷を下げるようにする機能があるのですが、そのキャッシュの保持する時間で沼ったのでブログでまとめます。

ReactQueryのキャッシュについて

キャッシュを保持する機能として下記があります。

- cacheTime
- staleTime

デフォルトだとcacheTImeの方は5分、staleTimeの方は0秒となっています。

で、この2つの意味の違いに注意が必要です。

  • cacheTime:キャッシュを保持しておく時間
  • staleTime:キャッシュを古くなったとみなす時間

わかりにくいので、ちょっと具体例で書いておきます。

ReactQueryのcacheTimeとstaleTimeの比較

- cacheTime:5分
- staleTime:3分

上記の場合、キャッシュを保持しておく時間が5分です。そして、キャッシュが古くなったとみなす時間が3分です。

1分経過後

キャッシュを保持しているし、キャッシュは新しいデータとして保持しています。

3分経過後

staleTimeの時間を経過したので、キャッシュは古いデータとしてみなされます。 この場合、キャッシュは返しますが、バックグラウンドでサーバーから取得してきます。

5分経過後

cacheTimeを経過したので、キャッシュは保持しておらずサーバーからデータを取得してきます。 なお、staleTime経過時にサーバーから取得していた場合は、そこからの5分は有効です。

この動作を踏まえると、

- cacheTime:3分
- staleTime:5分

こういった設定は意味がなく、cacheTimeのみ考えたらよく、staleTimeはデフォルトが0なので、Infinityを設定するとシンプルになります。

ざっくりまとめておくと、、

  • 頻繁にデータ更新がある:staleTimeを短くする
  • あまりデータ更新がない:staleTimeを長くする

上記が良いのかなと思いました。 いずれにしてもキャッシュを有効活用して、通信の負荷を下げれるように活用したいと思いました。