前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot中的cache(二)

springboot中的cache(二)

作者头像
润森
修改2019-12-26 14:27:25
4720
修改2019-12-26 14:27:25
举报
文章被收录于专栏:毛利学Python毛利学Python

springboot 自定义 cache

原理:在 SpringBoot 的 Cache 中,会默认使用 SimpleCacheManager, 生成一个 KeyGenerator(),将数据保存在 ConcurrentMap<Object, Object>

也就是重写一个 MyCacheConfig类,来覆盖 @EnableCaching默认的方法

代码语言:javascript
复制
@Configuration
public class MyCacheConfig {
    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName() + "[" + Arrays.asList(params).toString() + "]";
            }
        };
    }
}

在这里打下断点来测试

访问来到了自定义的配置的 cache,说明配置成功

## @Cacheable

@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

@Cacheable 作用和配置方法

|

参数

解释

example

value

缓存的名称 在 spring 配置文件中定义,必须指定至少一个

例如 @Cacheable(value=”mycache”)@Cacheable(value={”cache1”,”cache2”}

key

缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合

@Cacheable(value=”testcache”,key=”#userName”)

condition

缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存

@Cacheable(value=”testcache”,condition=”#userName.length()>2”)

代码语言:javascript
复制
// value指的是路由emp,
@Cacheable(value = {"emp"}  ,keyGenerator = "myKeyGenerator", condition = "#a0>1",unless = "#a0==2")
public Employee getEmp(Integer id) {
    System.out.println("查询" + id + "号员工");
    Employee emp = employeeMapper.getEmpById(id);
    return emp;
}
  • cacheManager:指定缓存管理器;或者 cacheResolver 指定获取解析器
  • condition:指定符合条件的情况下才缓存;
  • condition = "#id>0"

condition = "#a0>1":第一个参数的值 > 1 的时候才进行缓存

  • unless: 否定缓存;当 unless 指定的条件为 true,方法的返回值就不会被缓存;可以获取到结果进行判断
  • unless = "#result == null"`

unless = "#a0==2": 如果第一个参数的值是 2,结果不缓存;

## @CachePut

@CachePut:既调用方法,又更新缓存数据;同步更新缓存 修改了数据库的某个数据,同时更新缓存;

使用 CachePut 注解,该方法每次都会执行,会清除对应的 key 值得缓存 (或者更新),分为以下两种情况:

如果返回值 null,下次进行该 key 值查询时,还会查一次数据库,此时相当于 @CacheEvict 注解; 如果返回值不为 null,此时会进行该 key 值缓存的更新,更新缓存值为返回的数据;

@CachePut 注释,这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新。

代码语言:javascript
复制
@CachePut(value = "emp",key = "#result.id")
public Employee updateEmp(Employee employee) {
    System.out.println("updateEmp:" + employee);
    employeeMapper.updateEmp(employee);
    return employee;
}
测试步骤:
代码语言:javascript
复制
* 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号员工没有在缓存中更新】

现在将 1 号数据更改

再查就是 maoli 了

## @CacheEvict

@CacheEvict 缓存清除 key:指定要清除的数据

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

查询 1 号

删除 1 号员工

查不到

原创声明:本文是毛利原创文章

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-22,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • springboot 自定义 cache
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com