目录

前言

介绍

如何使用


前言

Cache是spring的数据缓存的方法,主要作用就是提升查询速度,对数据库进行的CRUD的操作中无疑对查询的次数是最多的,往往查询的时候要连接很多表去获取不同表里的数据,或做其他各种数据处理,这样会导致查询效率极低,接口响应慢。这时候我们就可以使用Cache数据缓存方法进行数据缓存达到查询速度的提升。

介绍

Cache是一个类似Map的数据结构,并临时存储以Key为索引的值。

其中常用的几个注解:

@EnableCaching:开启基于缓存的注解 加载启动类上。

@Cacheable:作用于查询方法上,查询接口继续缓存。

@CacheEvict:清除缓存,适用于删除方法上。

@CachePut:调用方法,又更新缓存数据,适合用于修改方法上,修改数据内容同时缓存。

常用属性:

cacheNames/value:用来指定缓存组件的名字


key:                          缓存数据的key,同map的key。默认使用方法参数的值。


keyCenerator:         key的生成器,key和keyGenerator二选一使用 不可同时使用,一般在                                                        key=“”里直接自己指定key就可以了。


condition:                符合指定的条件后才进行缓存操作


unless:                     符合指定的条件后不缓存,不符合时缓存。同condition相反,也可以                                                        通过返回接口进行判断。使用#result 获取方法返回结果。


sync:                        是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的                                                        结果存到缓存中。

如何使用

引入pom

<dependency>
            <groupId>maven_cangku.org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>

启动类开启注解缓存

@SpringBootApplication
@MapperScan("com.cache.firstcache.cache.mapper")
@EnableCaching//开启基于注解的缓存
public class FirstcacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstcacheApplication.class, args);
    }

}

@Cacheable的使用

查询的时候添加@Cacheable注解用于将查询结果进行缓存到“SysUser”缓存中,key取用接口参数id的值,且当id<3的时候缓存。(补充:如果接口接收的是对象,则key取值 key="#user.id")

@RequestMapping("selectUserById")
    //@Cacheable(cacheNames = "SysUser" ,key = "#id",condition = "#id<3",unless = "#id==1")
    @Cacheable(cacheNames = "SysUser", key = "#id", condition = "#id<3")
    /**
     *cacheNames:缓存名 查询到符合条件的数据会放进去下次即不会查询数据库 节省时间
     * key:存进去数据的标识 eg:根据id当作标识 删除更新缓存时可以根据id标识更新到同一个查询缓存组的指定标识(id)数据
     * condition: 满足什么条件的情况下缓存生效
     * unless: 满足什么条件的情况下缓存不生效
     * @Return
     * @Author
     * @Date 2022/6/14
     **/
    public ResponVo selectUserById(Integer id) {
        return sysUserServer.selectUserById(id);
    }

@CachePut

修改方法添加@CachePut 保证方法被调用,又希望结果被缓存。修改完成后的结果会进行缓存到指定的cacheNames下的key值里。

/**
     * @param
     * @Description TODO 修改用户信息
     * @Return
     * @Author 
     * @Date 2022/6/14
     **/
    @RequestMapping("updateUserById")
    @CachePut(cacheNames = "SysUser", key = "#sysUser.getUserId()")
//    @CachePut(cacheNames = "SysUser",key = "#result.data")
    //@CachePut  修改缓存 返回的结果会返回到cacheNames指定的缓存组中
    // 当指定key后会返回到指定key,key不填,则默认参数为key
    public ResponVo updateUserById(SysUser sysUser) {
        return sysUserServer.updateUserById(sysUser);
    }

@CacheEvict

删除方法适用清除缓存,清除掉“SysUser”缓存中key为id值的缓存。

/**
     * @param id
     * @Description TODO 删除用户
     * @Return
     * @Author
     * @Date 2022/6/14 
     **/
    @RequestMapping("deleteUserById")
    @CacheEvict(cacheNames = "SysUser", key = "#id")
    //@CacheEvict 清除缓存  cacheNames 是清除的缓存组 key 为清除那个标识的数据 eg: #id  取的是参数id的值  删除id=1的 即清除掉缓存组中key=1的数据
    public ResponVo deleteUserById(Integer id) {
        return sysUserServer.deleteUserById(id);
    }

@Caching设置方法的复杂缓存规则

@Caching( 
cacheable = {
 @Cacheable(/*value = "SysUser",*/ key = "#lastName") 
}, 
put = { 
//Put一定是在执行方法之后调用,只要一个方法标了@CachePut,那么每次执行查询都会直接去查数据库,然后再将结果插入到缓存中,
但是下次在用id查询的时候就不需要查询数据库了,直接从缓存中lookup->get(key) @CachePut(/*value = "SysUser",*/ key = "#result.id"), 
@CachePut(/*value = "SysUser",*/ key = "#result.email") 
} 
)

@CacheConfig:抽取类中的所有@CachePut@Cacheable@CacheEvict的公共配置

eg:可以把这个Controller里的缓存方法的cacheNames提到Controller上 那么这个Controller里的方法都不必再写明cacheNames="SysUser"

@RestController
@CacheConfig(cacheNames = "SysUser")
public class SysUserController {
}

小结

Cache数据缓存比较简单,基本是几个常用注解的灵活调配使用,但是使用面不是很广,更多的场景可能需要集成redis,之后的篇章会将其写入。感兴趣的朋友可以关注一波,共同学习共同变强!

附:人最可悲的是自己不能战胜自己,不甘心就拼一把。