[▲ Vercel Community](/) · [Categories](/categories) · [Latest](/latest) · [Top](/top) · [Live](/live)

[Help](/c/help/9)

# Unstable_cache doesn't revalidate

258 views · 0 likes · 3 posts


Cers (@cers) · 2024-07-16

We have a wrapper around unstable cache:
```
import { unstable_cache as next_unstable_cache } from 'next/cache'
import { isTest } from '@/lib/config'

type UnstableCache = typeof next_unstable_cache

/**
 * Allows you to cache the results of expensive operations, like database queries, and reuse them across multiple
 * requests.
 *
 * @param callback This is an asynchronous function that fetches the data you want to cache.
 * It must be a function that returns a Promise.
 * @param keyParts This is an array that identifies the cached key. It must contain globally unique values that together
 * identify the key of the data being cached. The cache key also includes the arguments passed to the function.
 * @param [options] This is an object that controls how the cache behaves. It can contain the following properties:
 * @param [options.tags] An array of tags that can be used to control cache invalidation.
 * @param [options.revalidate] The number of seconds after which the cache should be revalidated. Default is 86400
 * (24 hours in seconds)
 * @returns a function that when invoked, returns a Promise that resolves to the cached data. If the data is not in the
 * cache, the provided function will be invoked, and its result will be cached and returned.
 */
export const unstable_cache: UnstableCache = (callback, keyParts?, options?) => {
  // in test we bypass the cache, return the callback as is
  if (isTest) return callback

  // provide a saner default ttl
  return next_unstable_cache(callback, keyParts, { revalidate: 24 * 60 * 60, ...options })
}
```

Hopefully we agree that this should by default cache result for 24 hours.

It seems however, as best I have been able to verify, that when I use this wrapper, the data never updates from the originally cached value. In once case it seems to have been cached for at least 21 days.

```
import { unstable_cache } from '@/lib/api/unstable_cache'
const cachedHubspotOwnerForUserId = unstable_cache(
  (userId, mock) => hubspotOwnerForUserId(userId, mock),
  ['account/executive'],
)
```

I can control the `mock` passed in to verify that given differing keys (but same userId) it does return an updated value.

I haven't found a good way to inspect the data cached using unstable_cache, so I'm hoping you have some insight here.

Best regards,
Christian Sonne


Amy Egan (@amyegan) · 2024-07-17

Hey @cers! I have a few questions to get us headed in the right direction.

- Was revalidate previously set to a different number?
- Do you get a different result using `revalidateTag()` or `revalidatePath()`?
- What happens if you use `86400` instead of `24 * 60 * 60`?
- Have you sent a [Next.js bug report](https://github.com/vercel/next.js/issues/new?assignees=&labels=bug&projects=&template=1.bug_report.yml) to the team?


Cers (@cers) · 2024-07-17

Hi Amy! Thanks for your reply.

revalidate was always set to the same number.
I haven't tried any of those two/three suggestions, can try and report back.
I haven't filed a bug, but I did find this issue shortly after writing this post: https://github.com/vercel/next.js/issues/67751

In short, someone else has the same issue, exactly with 24 hours too, but not with other values