Netlify implements the standard split between CDN and browser caching. Cache-Control reaches the browser, CDN-Cache-Control is honored by any conforming CDN, and Netlify-CDN-Cache-Control is Netlify-specific and takes precedence on their edge.
That lets a function return a browser-facing Cache-Control of no-store or must-revalidate while the edge holds the response for hours, which is what makes edge caching usable for personalized-looking but shared content.
Responses can also carry a Cache-Tag header and later be invalidated by tag through the purge API, so a content change can flush exactly the affected pages instead of the whole site.
Inspect the outcome with the Cache-Status response header, which names the cache that handled the request and whether it was a hit. The default worth remembering: without any of these headers, function responses are not cached at all, so an unchanged function that suddenly costs more invocations usually lost its cache headers in a refactor.