add cache and is_update_expired() funciton to avoid get data very often