Spring Cache快速入门

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,

例如: EHCache Caffeine Redis

Maven坐标导入

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

Spring Cache常用注解

|----------------|-------------------------------------------------------------|
| 注解 | 说明 |
| @EnableCaching | 开启缓存注解功能,通常加在启动类上 |
| @Cacheable | 在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中 |
| @CachePut | 将方法的返回值放到缓存中 |
| @CacheEvict | 将一条或多条数据从缓存中删除 |

使用实例

java 复制代码
    /**
     * 条件查询
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询套餐")
    @Cacheable(cacheNames ="setmealCache", key = "#categoryId")
    public Result<List<Setmeal>> list(Long categoryId) {
        Setmeal setmeal = new Setmeal();
        setmeal.setCategoryId(categoryId);
        setmeal.setStatus(StatusConstant.ENABLE);

        List<Setmeal> list = setmealService.list(setmeal);
        return Result.success(list);
    }

如上代码,当需要查询时,因为使用了Cacheable注解,程序会先到redis中寻找对应的key是否存在,如果存在则直接取出其数据,不执行方法的代码,如果不存在则执行方法并把方法返回值存储到redis中,返回值在redis中的key为 cacheNames::key,上述代码为setmealCache::categoryId。key标签内的值如果是"#方法参数名"则是直接从方法的参数中获取对应的值,即获取到前端传来的参数值。如果使用的是"#result"则是获取到当前方法的返回结果。还有一种写法是用p0,p1或a0,a1获取到对应的参数。例如上述代码若使用key="#p0"则代表获取参数列表的第一个参数,即为categoryId,如果使用key="#p1"则为第二个参数(当然现在的代码里拿不到,因为没有第二个参数,会报错)。

示例二

java 复制代码
    @PostMapping
    @ApiOperation("新增套餐")
    @CacheEvict(cacheNames = "setmealCache" ,key = "#setmealDTO.categoryId")
    public Result save(@RequestBody SetmealDTO setmealDTO){
        log.info("新增套餐");
        setmealService.save(setmealDTO);
        return Result.success();
    }

以上是CacheEvict的使用示例,代表当新增套餐时,会从redis中删除名为setmealCache::categoryId的key。

示例三

java 复制代码
 @DeleteMapping
    @ApiOperation("删除套餐")
    @CacheEvict(cacheNames = "setmealCache" ,allEntries = true)
    public Result delete(@RequestParam List<Long> ids){
        log.info("根据id批量删除套餐");
        setmealService.delete(ids);
        return Result.success();
    }

当需要删除setmealCache全部的缓存时,可以加入allEntries标签并设置为true,此时可以将setmealCache::any,都删掉。

相关推荐
2401_894915531 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
Java牛马5 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌6 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西6 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
正儿八经的少年6 小时前
布隆过滤器(解决redis缓存穿透步骤之一)
数据库·redis·缓存
xrandzj7 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉7 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql
mqiqe7 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
denggun123457 小时前
yield
前端·数据库·python
脉动数据行情7 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股