引入caffeine坐标进行注册bean 和开启缓存注解@Configuration @EnableCaching //开启缓存 public class CaffeineConfig { /** * @return */ @Bean public Caffeine caffeineConfig() { Caffeine caffeine = Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.MINUTES) .maximumSize(1000); return caffeine; } @Bean public CacheManager cacheManager(Caffeine caffeine) { CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager(); caffeineCacheManager.setCaffeine(caffeine); return caffeineCacheManager; } } Caffeine配置说明:initialCapacity=[integer]:初始的缓存空间大小 maximumSize=[long]:缓存的最大条数 maximumWeight=[long]:缓存的最大权重 expireAfterAccess=[duration]:最后一次写入或访问后经过固定时间过期 expireAfterWrite=[duration]:最后一次写入后经过固定时间过期 refreshAfterWrite=[duration]:创建缓存或者最近一次更新缓存后经过固定的时间间隔,刷新缓存 同时也需要注意 expireAfterWrite和expireAfterAccess同时存在时,以expireAfterWrite为准。 maximumSize和maximumWeight不可以同时使用。在yml文件中spring: cache: caffeine: spec: maximumSize=500,expireAfterWrite=5s type: caffeine 4. 在具体的类型上的使用方法@Service @CacheConfig(cacheNames = "iSysClientService") public class SysClientServiceImpl extends BasicServiceImpl com.github.ben-manes.caffeine caffeine3.0.5 implements ISysClientService { private HashMap userInfoMap = new HashMap<>(); @Override @CachePut(key = "#userInfo.id") public void addUserInfo(UserInfo userInfo) { log.info("create"); userInfoMap.put(userInfo.getId(), userInfo); } @Override @Cacheable(key = "#id") public UserInfo getByName(Integer id) { log.info("get"); return userInfoMap.get(id); } @Override @CachePut(key = "#userInfo.id") public UserInfo updateUserInfo(UserInfo userInfo) { log.info("update"); if (!userInfoMap.containsKey(userInfo.getId())) { return null; } // 取旧的值 UserInfo oldUserInfo = userInfoMap.get(userInfo.getId()); // 替换内容 if (!StringUtils.isEmpty(oldUserInfo.getAge())) { oldUserInfo.setAge(userInfo.getAge()); } if (!StringUtils.isEmpty(oldUserInfo.getName())) { oldUserInfo.setName(userInfo.getName()); } if (!StringUtils.isEmpty(oldUserInfo.getSex())) { oldUserInfo.setSex(userInfo.getSex()); } // 将新的对象存储,更新旧对象信息 userInfoMap.put(oldUserInfo.getId(), oldUserInfo); // 返回新对象信息 return oldUserInfo; } @Override @CacheEvict(key = "#id") public void deleteById(Integer id) { log.info("delete"); userInfoMap.remove(id); } }注解解释说明 @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。 @Cacheable:主要方法返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。 @CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。 @CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。 @Caching:配置于函数上,组合多个Cache注解使用。