当前位置: 首页 > 科技观察

没有Redis,SpringBoot集成了Ehcache来实现缓存

时间:2023-03-17 23:16:37 科技观察

前言日常项目中使用缓存,方便暂存一些数据,加快访问速度。如果项目比较小,搭建一个redis服务,后期维护会比较麻烦。今天分享一个SpringBoot集成Ehcache实现缓存的教程,适合中小型项目使用。准备工作1.在maven中导入依赖org.springframework.bootspring-boot-starter-cacheorg.ehcacheehcache3.8.1javax.cachecache-api1.1.12.添加缓存注解@MapperScan("com.zhangls.ehcache.dao.**")@SpringBootApplication@EnableCachingpublicclassEhcacheApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EhcacheApplication.class,args);}}3、配置Ehcache,在resources下添加ehcache.xml文件,配置如下:<服务>java.lang.Stringcom.zhangls.ehcache.entity.User120001004.在application.yml中配置spring:cache:jcache:config:classpath:ehcache.xml注意事项1.Ehcache会按照一定的规则序列化存储到硬盘磁盘,所以缓存对象必须支持序列化。publicclassUserimplementsSerializable{}2、Spring定义了缓存接口Cache和管理缓存控制器CacheManager,路径为importorg.springframework.cache.Cache;导入org.springframework.cache.CacheManager;使用方法--手动管理@AutowiredprivateCacheManagercacheManager;@GetMapping("/addCache")publicStringaddCache(){Useruser=newUser();user.setUsername("九天银河聊天编程");user.setAge(34);缓存cache=cacheManager.getCache("用户缓存");cache.put("用户",用户);SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");现在日期=新日期();returnsdf.format(now)+":"+"保存成功";}@GetMapping("/getCache")publicStringgetCache(){Cachecache=cacheManager.getCache("UserCache");Cache.ValueWrapperres=cache.get("用户");SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");现在日期=新日期();if(null!=res){Useruser=(User)res.get();//这里获取ehcache.xml中value-type定义的类型,直接强制即可。返回sdf.format(now)+":"+"姓名:"+user.getUsername()+",年龄:"+user.getAge();}returnsdf.format(now)+":"+"NoFoundthecache!";}执行结果:127.0.0.1:8080/ehcache/addCache。执行:127.0.0.1:8080/ehcache/getCache。1分钟后执行:127.0.0.1:8080/ehcache/getCache,缓存失效。使用方法——@Cacheable注解服务代码:@ServicepublicclassImPersonServiceImplimplementsImPersonService{@ResourceprivatePersonMapperpersonMapper;@Override@Cacheable(cacheNames="PersonCache",key="#personId")publicImPersonselectByPrimaryKey(StringpersonId){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");现在日期=新日期();System.out.println(sdf.format(now)+":缓存未命中,请求数据库");返回personMapper.selectByPrimaryKey(personId);}}控制器代码:@GetMapping("/getCachePerson")publicImPersongetCachePerson(){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");日期开始=newDate();System.out.println(sdf.format(start)+":执行开始------");ImPersonperson=imPersonService.selectByPrimaryKey("1");结束日期=新日期();System.out.println(sdf.format(end)+":执行结束-----");归还人;}执行两次:127.0.0.1:8080/ehcache/getCachePerson控制台只打印一次SQL信息,说明第二次请求是从缓存中获取的。@Cacheable属性说明cacheNames/value:用于指定缓存组件的名称。key:缓存数据时使用的key,可以用来指定。默认是使用方法参数的值。(您可以使用spEL表达式编写此密钥)。keyGenerator:密钥的生成器。在key和keyGenerator之间选择。cacheManager:可用于指定缓存管理器。从哪个缓存管理器获取缓存。condition:可以用来指定满足条件才缓存。下面表示缓存了id>1。@Cacheable(cacheNames="PersonCache",condition="#id>1")unless:取消缓存。当unless指定的条件为真时,方法的返回值将不会被缓存。当然你也可以获取结果进行判断。(通过#result获取方法结果)。sync:是否使用异步模式。踩坑说明Spring缓存注解是基于SpringAOP切面的,必须经过代理才能生效。当同类调用或子类调用父类有缓存注解的方法时,是没有代理的内部调用,注解不会生效。所以使用@Cacheable时,必须在服务的实现类中调用。