@Gertjan Not correct as in serve-expired is not irrelevant.
Your case might work ok for you, as it depends on how many clients you have and what domains they are requesting.
But if a domain is not requested within 10% of the TTL then it will not be prefetched.
If you don't believe me you can check the code, or ask the dev
https://github.com/search?q=repo%3ANLnetLabs%2Funbound%20prefetch&type=code
So a scenario where a record is fetched, not reused within it's TTL, and then expired - (thereby removed from the cache) is required to be fetched again even with prefetch enabled.
Say you are only using prefetch....with 5 min TTLs or less (or even 30 min TTLs) or less being the norm today, you can have scenarios where peak periods of your network are serviced well by the cache. But if there is another peak period later in the day, the cache has to get almost rebuilt.
With serve-expired you can keep these records in the cache from one peak period to the next. Then use serve-expired-ttl to optimise how long the records are kept. For me 1 day is good so that the peak periods throughout the day are served with an already healthy cache before the device requests it.
Hope that makes sense.