implement cache and request limit