当前位置:   article > 正文

springboot整合ehcache实现二级缓存踩坑_cacheable 踩坑

cacheable 踩坑

最近在优化项目代码,发现了有一个接口A执行的时候会频繁调用另一个获取用户信息的接口B。虽然接口B加了redis缓存,但是由于redis服务器是单独部署,频繁的I/O请求仍然对接口响应性能有影响,于是想到了加二级缓存,这样接口A调用接口B的时候可以把重复的用户信息暂存,进而提高性能。

二级缓存很多,我选择了ehcache。在网上搜了一些教程,发现配置非常简单,于是立刻着手做,然而过程其实并不顺利,踩了一些坑,这里记录下。

1、pom引入。注意<version>标签,如果是springboot的话应该会自动匹配版本号,也可以自己填写2.10.6之类的。

  1. <dependency>
  2. <groupId>net.sf.ehcache</groupId>
  3. <artifactId>ehcache</artifactId>
  4. <version>${ehcache.version}</version>
  5. </dependency>

2、在resources目录下创建一个ehcache.xml配置文件,该文件存储了ehcache相关的配置,示例如下。我这里配置了一个名叫gatewayUser的缓存,过期时间设置为2分钟,下面会用到。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  4. <diskStore path="java.io.tmpdir"/>
  5. <!-- 设定缓存的默认数据过期策略 -->
  6. <defaultCache
  7. maxElementsInMemory="10000"
  8. eternal="false"
  9. timeToIdleSeconds="120"
  10. timeToLiveSeconds="120"
  11. overflowToDisk="true"
  12. maxElementsOnDisk="10000000"
  13. diskPersistent="false"
  14. diskExpiryThreadIntervalSeconds="120"
  15. memoryStoreEvictionPolicy="LRU"/>
  16. <!-- 自定义的缓存 -->
  17. <cache name="gatewayUser"
  18. maxElementsInMemory="1000"
  19. eternal="false"
  20. timeToIdleSeconds="120"/>
  21. </ehcache>

这里有一个小点需要注意:

<ehcache>标签中的

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"

可以不加,没什么影响。如果加了发现飘红,可采用以下方式处理Idea 使用ehcache.xml 出现异常_OY..的博客-CSDN博客

3、在Application启动类上添加@EnableCaching注解

4、在方法上加注解:

注意这里的value一定和xml配置文件中的名字相同。比如这里的value为“gatewayUser”,则对应的就是ehcache.xml文件中自定义的“gatewayUser”配置,表示该方法的缓存都会使用同一个配置,且都会放在同一个缓存中。key表示每个缓存的唯一标识,这里用userId就可以了。

特别注意,为了使得@Cacheable生效,方法必须是public;如果同一个类中调用,还必须注入当前类,这样才能触发AOP。

网上很多资料到这里基本就结束了,但如果你运行程序并调用该方法,会报错,类似这种:

  1. {
  2. "code": 8000,
  3. "data": [],
  4. "message": "未知错误java.lang.IllegalArgumentException: Cannot find cache named 'gatewayUser' for Builder......
  5. }

程序提示没有找到相应的cache,如果在源码上打断点,会发现确实没有正确的加载缓存配置: 

这里有人会说需要在application.yml中加以下配置:

spring.cache.ehcache.config=classpath:ehcache.xml

但其实加了仍旧会报错!因为ehcache默认的会去resource目录下找ehcache.xml配置,所以这里加不加无所谓。其实这里是少了一个配置类。

5、(重要)再写一个cacheManager配置类:

  1. package ......
  2. import org.springframework.cache.CacheManager;
  3. import org.springframework.cache.annotation.EnableCaching;
  4. import org.springframework.cache.ehcache.EhCacheCacheManager;
  5. import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.core.io.ClassPathResource;
  9. @Configuration
  10. @EnableCaching
  11. public class EhCacheConfig {
  12. //需要生成一个缓存管理器
  13. @Bean
  14. public CacheManager cacheManager() {
  15. net.sf.ehcache.CacheManager ehCM = ehCacheCacheManager().getObject();
  16. CacheManager cacheManager = new EhCacheCacheManager(ehCM);
  17. return cacheManager;
  18. }
  19. //缓存管理器由该工厂Bean生成
  20. @Bean
  21. public EhCacheManagerFactoryBean ehCacheCacheManager() {
  22. EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
  23. cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));//工厂去读配置文件
  24. cmfb.setShared(true);
  25. return cmfb;
  26. }
  27. }

 再次运行程序,发现缓存已生效!

到这里ehcache缓存已经能够正常工作了。

在方法内部我们仍旧使用redis进行缓存。这样就实现了二级缓存,程序性能又能提升啦。

  1. @Cacheable(value="gatewayUser", key="#userId")
  2. public GatewayUser getUserInfoByUserId(Integer userId) {
  3. String key = "userinfo:" + userId.toString();
  4. //尝试从redis缓存中获取
  5. String userstr = redis.opsForValue().get(key);
  6. GatewayUser gatewayUser = null;
  7. if (StringUtils.isNotBlank(userstr)) {
  8. return JSON.parseObject(userstr, GatewayUser.class);
  9. } else {
  10. //到数据库中查询
  11. //将查询结果插入redis缓存中
  12. redis.opsForValue().set(key, reportStat);
  13. redis.expire(key, 3600 * 48, TimeUnit.SECONDS);
  14. return gatewayUser;
  15. }
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/745027
推荐阅读
相关标签
  

闽ICP备14008679号