spring boot缓存

cache

1、@Cacheable

记得类上面添加:@EnableCaching

    /**
     * 将方法的运行结果进行缓存;以后再要相同的数据,直接从缓存中获取,不用调用方法
     * CacheManager管理多个Cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字
     * 几个属性:
     *      cacheNames/values:指定缓存组件的名字;将方法返回的结果放在哪个缓存中,是数组的方式,可以指定多个缓存
     *      key:缓存数据使用的key,可以用它来指定。默认是使用方法参数的值 1-方法的返回值
     *              编写SpEL; #id;参数id的值  #a0  #p0  #root.args[0]
     *      keyyGenerator:key的生成器;可以自己指定key的生成器组件id
     *          key/keyGenerator:二选一使用
     *      cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
     *      condition:指定符合条件的情况下才缓存
     *      unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断
     *              unless = "#result == null"
     *              unless = "#a0==2":如果第一个参数的值是2,结果不缓存
     *      sync:是否使用异步模式
     */
    @Cacheable(cacheNames = {"emp"})
    public Employee getEmp(Integer id){
        System.out.println("查询"+id+"号员工");
        Employee employee = employeeMapper.getEmpById(id);
        return employee;
    }

2、@CachePut更新缓存

    /**
     * @CachePut:即调用方法,又更新缓存数据
     * 修改了数据库的某个数据,同时更新缓存
     * 运行时机:
     *  1、先调用目标方法
     *  2、将目标方法的结果缓存起来
     *
     * 测试步骤:
     *  1、查询1号员工;查到的结果会放在缓存中
     *      key: 1 value:lastName:张三
     *  2、以后查询还是之前的结果
     *  3、更新1号员工:【lastName:zhangsan; gender:0】
     *          将方法的返回值也放进缓存了
     *          key:传入的employee对象 值:返回的employee对象
     *  4、查询1号员工?
     *      应该是更新后的员工:
     *          key = "#employee.id":使用传入的参数的员工id
     *          key = "#result.id":使用返回后的id
     *              @Cacheable的key是不能用#result
     *      为什么是没更新前的?【1号员工没有在缓存中更新】
     */
    @CachePut(value = "emp",key = "#employee.id")
        public Employee updateEmp(Employee employee){
            employeeMapper.updateEmp(employee);
            return employee;
    }

3、@CacheEvict缓存清除

    /**
     * @CacheEvict:缓存清除
     * key:指定要清楚的数据
     * allEntries = true: 指定清楚这个缓存中所有的数据
     * beforeInvocation = false: 缓存的清楚是否在方法之前执行
     *      默认代表缓存清除操作方法是在方法之后执行的;如果出现异常缓存就不会清楚
     * 
     */
    @CacheEvict(value = "emp",key = "#id")
    public void deleteEmp(Integer id){
        System.out.println("deleteEmp:"+id);
        //employeeMapper.deleteEmpBuId(id);
    }

4、@Caching和@Config

    @Caching(
            cacheable = {
                    @Cacheable(value = "emp",key = "#lastName")
            },
            put = {
                    @CachePut(value = "emp",key = "#result.id"),
                    @CachePut(value = "emp",key = "#result.email"),
            }
    )
    @ResponseBody
    @RequestMapping("/emp/lastName/{lastName}")
    public Employee getEmpByLastName(@PathVariable("lastName") String lastName){
        Employee employee = employeeService.getEmpByLastName(lastName);
        return employee;
    }
}

@CacheConfig(cacheNames=“emp”)用于标注在类上,可以存放该类中所有缓存的公有属性,比如设置缓存的名字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值