第6篇 springboot2 集成缓存jetcache(不是springcache)

1、JetCache简介

JetCache 是由阿里巴巴开源的一款通用缓存访问框架。官方文档说明JetCache 提供的核心能力包括:

  • 提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
  • 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  • 分布式缓存自动刷新,分布式锁 (2.2+)
  • 支持异步Cache API
  • Spring Boot支持
  • Key的生成策略和Value的序列化策略是可以定制的
  • 针对所有Cache实例和方法缓存的自动统计

详细可查看JetCache的github地址:https://github.com/alibaba/jetcache

2、企业开发过程缓存的选择

在企业开发过程中,使用cache的常规操作对应增删改查,

  • 增加操作时,不使用缓存
  • 删除操作时,删除原有缓存
  • 修改操作时,删除原有缓存(不建议更新缓存)
  • 查看操作时,添加缓存信息
    最开始使用的spring cache,但是由于springcache只支持全局的缓存过期时间设置,不支持单个设置缓存过期时间,且jetcache支持三种缓存方式LOCAL/REMOTE/BOTH 三种选择, 分别代表本地内存/远程 Cache Server(如Redis)/两级缓存,下面以redis为存储,springboot整合jetcache

3、集成JetCache实现缓存

3.1增加jetCache的缓存配置

# 统计间隔,默认0:表示不统计
jetcache.statIntervalMinutes: 1
# areaName是否作为缓存key前缀,默认True
jetcache.areaInCacheName: false
# 已支持可选:linkedhashmap、caffeine
jetcache.local.default.type: linkedhashmap
# key转换器的全局配置,当前只有:fastjson, @see com.alicp.jetcache.support.FastjsonKeyConvertor
jetcache.local.default.keyConvertor: fastjson
# 每个缓存实例的最大元素的全局配置,仅local类型的缓存需要指定
jetcache.local.default.limit: 100
# jetcache2.2以上,以毫秒为单位,指定多长时间没有访问,就让缓存失效,当前只有本地缓存支持。0表示不使用这个功能
jetcache.local.default.expireAfterAccessInMillis: 30000
# 已支持可选:redis、tair
jetcache.remote.default.type: redis
jetcache.remote.default.database=1
jetcache.remote.default.host: 10.0.40.235
jetcache.remote.default.port: 6379
jetcache.remote.default.password=sundata
jetcache.remote.default.poolConfig.minIdle: 5
jetcache.remote.default.poolConfig.maxIdle: 20
jetcache.remote.default.poolConfig.maxTotal: 50
jetcache.remote.default.keyConvertor: fastjson
# 序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
jetcache.remote.default.valueEncoder: java
jetcache.remote.default.valueDecoder: java
# 以毫秒为单位指定超时时间的全局配置
jetcache.remote.default.expireAfterWriteInMillis: 5000

3.2启用缓存注解

在NatureEduWebApplication启动类增加两个注解@EnableCreateCacheAnnotation
@EnableMethodCache(basePackages = "com.nature.edu.service")
表示启用jetcache的注解和缓存作用的方法的范围,需要指定缓存类的包路径

package com.nature.edu;

import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
import com.alicp.jetcache.anno.config.EnableMethodCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * @author wangck
 * @date 2019/8/6
 */
@SpringBootApplication
@EnableCreateCacheAnnotation
@EnableMethodCache(basePackages = "com.nature.edu.service")
public class NatureEduWebApplication extends SpringBootServletInitializer {

    private static final Logger logger = LoggerFactory.getLogger(NatureEduWebApplication.class);

    @Autowired
    private RestTemplateBuilder builder;

    @Bean
    public RestTemplate restTemplate() {
        return builder.build();
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(NatureEduWebApplication.class);
    }

    public static void main(String[] args) throws Exception {
        logger.info("开始启动!");
        SpringApplication.run(NatureEduWebApplication.class, args);
        logger.info("启动完成!");
    }

}

3.3 实现类添加缓存操作

在UserServiceImpl的修改、删除、单个查询中指定缓存操作

  • 修改用户清除缓存,增加@CacheInvalidate注解
 @Override
    @CacheInvalidate(name="nature.edu.user",key="#user.userId")
    public Response modifyUser(UserVO user) {
        if (user == null) {
            logger.error("修改用户时,用户信息不能为空'");
            return Response.failResult("用户信息不能为空");
        }
        String userId = user.getUserId();
        if (StringUtils.isBlank(userId)) {
            logger.error("修改用户时,userId不能为空'");
            return Response.failResult("用户Id不能为空");
        }
        BasUser basUser = new BasUser();
        basUser.setUserId(userId);
        basUser.setUserNo(user.getUserNo());
        basUser.setUserName(user.getUserName());
        basUser.setPersonName(user.getPersonName());
        Integer count = basUserMapper.updateById(basUser);
        if (count > 0) {
            logger.info("修改用户成功,用户信息:{}", basUser);
            return Response.successResult("修改用户成功", true);
        } else {
            logger.error("修改用户失败,用户信息:{}", basUser);
            return Response.failResult("修改用户失败", false);
        }
    }
  • 删除用户清除缓存 ,增加@CacheInvalidate注解
 @Override
    @CacheInvalidate(name="nature.edu.user",key="#userId")
    public Response deleteUser(String userId) {
        if (StringUtils.isBlank(userId)) {
            logger.error("删除用户时,userId不能为空'");
            return Response.failResult("用户Id不能为空");
        }
        Integer count = basUserMapper.deleteById(userId);
        if (count > 0) {
            logger.info("删除用户成功,用户Id:{}", userId);
            return Response.successResult("删除用户成功", true);
        } else {
            logger.error("删除用户失败,用户id:{}", userId);
            return Response.failResult("删除用户失败", false);
        }
    }
  • 查询用户增加缓存,增加@Cached注解
@Override
    @Cached(name="nature.edu.user",key="#userId",expire = 3600, cacheType = CacheType.REMOTE)
    public Response getUser(String userId) {
        if (StringUtils.isBlank(userId)) {
            logger.error("查询用户信息时,userId不能为空'");
            return Response.failResult("用户Id不能为空");
        }
        BasUser basUser = basUserMapper.selectById(userId);
        if (basUser != null) {
            UserVO user = new UserVO();
            user.setUserId(basUser.getUserId());
            user.setUserNo(basUser.getUserNo());
            user.setUserName(basUser.getUserName());
            user.setUserHead(basUser.getUserHead());
            user.setPersonName(basUser.getPersonName());
            user.setPinyName(basUser.getPinyName());
            logger.info("查询用户成功,用户Id:{}", userId);
            return Response.successResult("查询用户成功", user);
        } else {
            logger.error("查询用户失败,用户Id:{}", userId);
            return Response.failResult("查询用户失败", null);
        }
    }

4、启动测试验证缓存是否生效

  • 连续两次查询用户信息,第二次查询启用查询未查询数据库


    第6篇 springboot2 集成缓存jetcache(不是springcache)_第1张图片
    image.png

    redis缓存数据


    第6篇 springboot2 集成缓存jetcache(不是springcache)_第2张图片
    image.png
  • 修改用户信息再查询用户信息

  • 删除用户信息再查询用户信息

使用说明3

代码发布到码云上:https://gitee.com/nature-edu/edu-parent

请关注我的微信公众号:

第6篇 springboot2 集成缓存jetcache(不是springcache)_第3张图片
image

你可能感兴趣的:(第6篇 springboot2 集成缓存jetcache(不是springcache))