Spring Cache

简介

spring提供的缓存框架,使用注解简化缓存代码,类似事物管理。

导入如下依赖

底层使用哪一个缓存实现就导入哪一个的以来,这里用的是Redis。还有诸如knife4j,druid,fastjson,mybatis等的依赖都要准备

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

常用注解

入门案例(@CachePut注解)

按照准备的资料的步骤建数据库建表,并配置好redis连接的信息。

项目里面有一个如下的配置,用于生成接口文档。

java 复制代码
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    /**
     * 生成接口文档配置
     * @return
     */
    @Bean
    public Docket docket(){
        log.info("准备生成接口文档...");

        ApiInfo apiInfo = new ApiInfoBuilder()
                .title("接口文档")
                .version("2.0")
                .description("接口文档")
                .build();

        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)
                .select()
                //指定生成接口需要扫描的包
                .apis(RequestHandlerSelectors.basePackage("com.itheima.controller"))
                .paths(PathSelectors.any())
                .build();

        return docket;
    }

    /**
     * 设置静态资源映射
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        log.info("开始设置静态资源映射...");
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

Controller层提供了如下的代码,增删改查都有。

java 复制代码
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @PostMapping
    public User save(@RequestBody User user){
        userMapper.insert(user);
        return user;
    }

    @DeleteMapping
    public void deleteById(Long id){
        userMapper.deleteById(id);
    }

	@DeleteMapping("/delAll")
    public void deleteAll(){
        userMapper.deleteAll();
    }

    @GetMapping
    public User getById(Long id){
        User user = userMapper.getById(id);
        return user;
    }
}

在启动类上加入注解

java 复制代码
@EnableCaching //开启缓存注解功能

在save方法上加入如下注解,达成新增数据时将数据插入缓存

同时这里使用springcache缓存数据时有一个规则

键值: "cacheNames::key" ,由这个注解的两个参数决定。

而一般缓存中的数据的键值都要有特定规则,key参数通常为数据id.

这里设置key参数时使用"#形参名.属性"的格式就可以动态获取实体类的属性字段。

并且还有不同的写法可以取到属性值。

使用形参名时是从传进来的user参数取到的,result是从返回值的user取到的,中间的点称为对象导航。

如果有多个参数时还有别的写法。

写p0就是取到第一个参数,p1就是第二个参数,a0也一样可以使用

还可以使用root.args[0]也是获取到第一个参数。

java 复制代码
    @PostMapping
    //@CachePut(cacheNames = "userCache",key = "#user.id")
    //@CachePut(cacheNames = "userCache",key = "#result.id")
    //@CachePut(cacheNames = "userCache",key = "#p0.id")
    //@CachePut(cacheNames = "userCache",key = "#a0.id")
    @CachePut(cacheNames = "userCache",key = "#root.args[0].id")
    public User save(@RequestBody User user){
        userMapper.insert(user);
        return user;
    }

swagger文档测试

mapper层设置了主键返回。所以controller才能获取到

java 复制代码
    @Insert("insert into user(name,age) values (#{name},#{age})")
    @Options(useGeneratedKeys = true,keyProperty = "id")
    void insert(User user);

设置了主键自增,不需要设定id

数据成功保存到数据库和redis

redis中的key也可以做成树形结构,通过冒号实现,两个冒号导致有一个Empty.

入门案例二(@Cacheable注解)

在查询时先查缓存有没有,没有才去数据库查询。

这里没有resule关键字,因为这个是在方法执行前生效,不能获取到方法结果。

java 复制代码
    @GetMapping
    @Cacheable(cacheNames = "userCache",key = "#id")  //key的生成:userCache::10
    public User getById(Long id){
        User user = userMapper.getById(id);
        return user;
    }

经过测试无误,这里使用到了代理技术,加上@Cacheable注解后可以在执行前创建一个Controller的代理对象。在代理对象查询不到的话会通过反射调用会真正的目标方法getById.

入门案例三(@CacheEvict注解)

清理一条或者多条缓存时使用。

删除单条数据使用key参数,删除全部键值对使用allEntries参数

java 复制代码
    @DeleteMapping
    @CacheEvict(cacheNames = "userCache",key = "#id")
    public void deleteById(Long id){
        userMapper.deleteById(id);
    }

    @DeleteMapping("/delAll")
    @CacheEvict(cacheNames = "userCache",allEntries = true)
    public void deleteAll(){
        userMapper.deleteAll();
    }
相关推荐
陈奕迅本讯8 分钟前
EasyExcel
java
刽子手发艺10 分钟前
POI和easyExcel的讲解和使用
java·后端·excel
007php00712 分钟前
使用 GoZero 实现读取绩效表格 Excel 并打分
java·python·云原生·容器·架构·golang·excel
拔剑纵狂歌20 分钟前
解决Docker环境变量的配置的通用方法
jvm·后端·docker·云原生·容器·学习方法
刘Java35 分钟前
Dubbo 3.x源码(24)—Dubbo服务引用源码(7)接口级服务发现订阅refreshInterfaceInvoker
java·rpc·服务发现·dubbo
刘Java42 分钟前
Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新
java·服务器·rpc·dubbo
庄小焱1 小时前
Java——并发工具类库线程安全问题
java·安全·firefox
JSON_L1 小时前
对接阿里云实人认证
后端·阿里云·php
wclass-zhengge1 小时前
SpringCloud篇(服务保护 - Sentinel)
spring·spring cloud·sentinel
埋头编程~1 小时前
【C++】踏上C++学习之旅(八):深入“类和对象“世界,掌握编程的黄金法则(三)(内含运算符重载和拷贝构造函数)
java·c++·学习