cache first, update later