springboot整合redis作为缓存

(一)新建工程,建立数据库及相关表,添加缓存注解

新建springboot工程时,选择I/O下的cache组件,就自动配置了cache依赖。

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_spring


在MySQL中新建spring_cache数据库,并添加两张表:

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_spring_02


项目中加入bean:

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_mysql_03


Mybatis操作数据库时,在mapper写入对部门和员工的增删改查语句,并在主程序设置mapperscan的地址(项目启动时会按照该路径扫描mapper):

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_spring_04


mybatis plus springboot 启动卡住 springboot配置mybatis缓存_mysql_05


项目层次结构

以下分别对应数据,控制和服务层:

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_spring_06


mybatis plus springboot 启动卡住 springboot配置mybatis缓存_redis_07

总体层次架构

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_java_08


层级之间的关系原理:将服务层注入控制层,控制层处理网页交互的任务

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_redis_09


将mapper接口注入服务层,为服务层的功能实现提供具体的增删改查方法

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_java_10

举例来说,mapper中employeeMapper接口语句如下:

@Select("SELECT * FROM employee WHERE id=#{id}")
    public Employee getEmpById(Integer id);
    @Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id=#{id}")
    public void updateEmp(Employee employee);
    @Delete("DELECT FROM employee WHERE id=#{id}")
    public void deleteEmpById(Integer id);
    @Insert("INSERT INTO employee(lastName,email,gender,d_id) VALUES(#{lastName},#{email},#{gender},#{dId})")
    public void insertEmployee(Employee employee);
    @Select("SELECT * FROM employee WHERE lastName=#{lastName}")
    public Employee getEmpByName(String lastName);

下面介绍通过注解的方式来使用缓存,对程序启动类加入@EnableCaching,service内部的方法上加入注解@Cacheable(cacheNames = {“emp”})

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_java_11


WARNING:缓存配置原理:

@cacheable注解的方法在执行前,先查询缓存,按照参数的值查询,若缓存中有,则返回缓存的数据,若没有,则调用方法,并将方法返回值存入缓存。

其中,cacheManager按照缓存名字得到cache组件,key使用可以generator来生成

几个注解

@cacheput,更新缓存,每次调用,将返回值放入缓存,用@cacheput做更新操作时,需要将key和查询时的key修改一致,才能保证在更新时使缓存中的数据关于指定ID被更新。由于cacheable有先查缓存的步骤,所以不能用result做key,可能还没有生成result,但put在方法执行之后,所以可以用result做key

@CacheEvict,清除缓存,其内置参数中:

allEntries:清楚所有缓存数据
beforeInvocation:默认false,方法正常结束之后才清除缓存,若方法有错误,则不清除缓存

@caching组合注解

@Caching(
        cacheable = {
                @Cacheable(value = "emp",key = "#lastName")
        },
        put ={//put在所注解的方法执行之后执行,所有有了result
                @CachePut(value = "emp",key = "#result.id"),
                @CachePut(value = "emp",key="#result.email")
        }
)
public Employee getEmpByLastName(String lastName){
    return employeeMapper.getEmpByName(lastName);
}

caching里面只要put,则一定会执行其注解的方法(本例为getEmpByLastName),用那么查询时一定会调用数据库。

也可以在@service上添加@cacheconfig全局注释,公共配置cache信息:

mybatis plus springboot 启动卡住 springboot配置mybatis缓存_java_12