优化了很多代码,使用缓存机制