SpringBoot2.x操作缓存的新姿势


prtyaa
prtyaa 2024-01-01 22:49:28 65020 赞同 0 反对 0
分类: 资源
一、介绍 spring cache 是spring3版本之后引入的一项技术,可以简化对于缓存层的操作,spring cache与springcloud stream类似,都是基于抽象层,可以任意切换其实现。 其核心是CacheManager、Cache这两个接口,所有由spring整合的cache都要实现这两个接口、Redis的实现类则是 RedisCache 和 RedisManager。

二、使用

1、查询

需要导入的依赖

<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>

编写对于cache的配置

@EnableCaching
@SpringBootConfiguration
public class CacheConfig {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean // 如果有多个CacheManager的话需要使用@Primary直接指定那个是默认的
    public RedisCacheManager cacheManager() {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 防止在序列化的过程中丢失对象的属性
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 开启实体类和json的类型转换
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 配置序列化(解决乱码的问题)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()   .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))             .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                // 不缓存空值
                .disableCachingNullValues()
                // 1分钟过期
                .entryTtl(Duration.ofMinutes(1))
                ;
        RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

进行以上配置即可使用springboot cache了,还有一个key的生成策略的配置(可选)

@Bean
public KeyGenerator keyGenerator() {
    return (target, method, params) -> {
        StringBuffer key = new StringBuffer();
        key.append(target.getClass().getSimpleName() + "#" + method.getName() + "(");
        for (Object args : params) {
            key.append(args + ",");
        }
        key.deleteCharAt(key.length() - 1);
        key.append(")");
        return key.toString();
    };
}

注意:如果配置了KeyGenerator ,在进行缓存的时候如果不指定key的话,最后会把生成的key缓存起来,如果同时配置了KeyGenerator 和key则优先使用key。推荐:深入SpringBoot核心注解原理

在controller或者service的类上面添加 @CacheConfig ,注解里面的参数详情见下表:

 

在标有@CacheConfig的类里面编写一个查询单个对象的方法并添加 @Cacheable注解

@Cacheable(key = "#id", unless = "#result == null") 
@PatchMapping("/course/{id}")
public Course courseInfo(@PathVariable Integer id) {
    log.info("进来了 .. ");
    return courseService.getCourseInfo(id);
}

执行完该方法后,执行结果将会被缓存到Redis:

 

@Cacheable注解中参数详情见下表:

 

2、修改

编写一个修改的方法,参数传对象,返回值也改成这个对象

@PutMapping("/course")
public Course modifyCoruse(@RequestBody Course course) {
    courseService.updateCourse(course);
    return course;
}

在方法上面添加 @CachePut(key = "#course.id") 注解,这个注解表示将方法的返回值更新到缓存中,注解中的参数和 @Cacheable 中的一样,这里就略过了。扩展:SpringBoot内容聚合

3、删除

编写删除方法,在方法上添加@CacheEvict 注解

@CacheEvict(key = "#id")
@DeleteMapping("/course/{id}")
public void removeCourse(@PathVariable Integer id) {
   courseService.remove(id);
}

@CacheEvict 的参数信息见下表:

 

三、 基于代码的Cache的使用

因为我们有配置的CacheManager,所以可以利用RedisCacheManager对象去手动操作cache,首先将CacheManager注入进来:

@Resource 
private CacheManager cacheManager;

@PatchMapping("/course2/{id}")
public Course course2(@PathVariable Integer id) {
    // 获取指定命名空间的cache
    Cache cache = cacheManager.getCache("course");
    // 通过key获取对应的value
    Cache.ValueWrapper wrapper = cache.get(2);
    if (wrapper == null) {
        // 查询数据库
        Course course = courseService.getCourseInfo(id);
        // 加入缓存
        cache.put(course.getId(), course);
        return course;
    } else {
        // 将缓存的结果返回
        // 因为配置了enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        // 所以在进行强转的时候不会报错
        return (Course) wrapper.get(); 
    }
}

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL3
粉丝 1 资源 1949 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  509
MiSans 阿拉伯语字体文件  450
解决新版本麒麟系统中微信打开白屏显示  393
麒麟系统进行系统监控,查看进程的运行时间来优化性能  326
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  217
统信桌面专业版添加字体  210
统信uos单一程序黑屏,任务栏正常显示解决办法  209
统信uos快捷键文档  181
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  119
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!