Use key-based caching instead of manual expiration