小弟不才,今天发现一个新大陆:缓存
缓存可以分为服务器缓存,第三方缓存(ehcache),分布式缓存(redis,mogodb等)
那为什么要使用缓存呢?
首先它的读写效率高,一般的数据库降数据存储在硬盘中,而缓存却是存储在内存中,优势显而易见,而缺点的话就是数据在停电的时候消失,而且内存比硬盘更贵。
众所周知缓存在大型项目中低位可谓是举足轻重,项目中少不了对数据库的操作,而频繁的操作数据,数据库的压力会变得比较大,从而导致资源请求的效率变慢,影响项目的用户体验.
java项目中spring不可缺少,spring默认使用ehcache作为缓存,springboot中配置encache比较简单
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableCaching
@EnableJpaAuditing
@EnableAsync
@MapperScan({"com.wineworld.hkshop.modules.mapper,com.wineworld.hkshop.modules.saleproduct.repository"})
public class Applicationextends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在配置一个ehcache.xml文件
<ehcache>
<diskStore path="java.io.tmpdir/缓存目录名/cache" />
<defaultCache maxElementsInMemory="100000" eternal="true" overflowToDisk="true" />
<cache name="缓存的value名" maxElementsInMemory="50000" maxElementsOnDisk="100000" eternal="true" overflowToDisk="true" />
</cache >
再到service层的实现类中加上注解进行缓存
@Override
@Cacheable(value ="user", key ="#root.targetClass + #ID", unless ="#result eq null")
public User getUserById(String ID) {
User user =userDao.getUserById(ID);
return user;
}
然后进行Controller层的编写,最后进行测试
第一次访问会到数据库中进行读取数据,加载到缓存中,在后面的访问中会直接在缓存中读书数据
我在windows7 8g i3 64位电脑上测试一个在4s左右不加缓存的访问,加上缓存只要8ms,速度快了几千倍,就想静态资源一样。
当然我们在操作对于缓存的数据库数据时,就相当于缓存失效了,就该进行缓存的清除,如调用下方法
@Override
@CacheEvict(value ="user", key ="#root.targetClass + #ID", condition ="#result eq 'yes'")
public String deleteUserById(String ID) {
return "yes";
}
到这里一次使用缓存的经历就有了,然而这里的缓存只是皮毛,我也会进行深入的学习,在后面的文章进行更新与大家分享