By default, React caches all fetch requests in Request Memoization. However, it also provides a cache function to wrap other non-fetch requests and make them behave like fetch requests.

import { cache } from "react"
import { queryDatabase } from "./databaseClient"
 
export const fetchUserData = cache(userId => {
  // Direct database query
  return queryDatabase("SELECT * FROM users WHERE id = ?", [userId])
})

References