SpringCache的简单应用

本文详细介绍了Spring Cache的使用,包括@Cacheable、@CacheEvict、@CachePut等注解的含义及配置,以及如何自定义缓存key、设置存活时间和数据格式。同时,探讨了Spring Cache在并发读写模式下可能遇到的问题和解决方案,如缓存穿透、缓存击穿和缓存雪崩,并强调了Spring Cache适用于读多写少、即时性要求不高的场景。
摘要由CSDN通过智能技术生成

常用注解

  • @Cacheable:将数据保存到缓存中
  • @CacheEvict:将数据从缓存中删除
  • @CachePut:不影响当前方法执行的情况下,更新缓存
  • @Caching:组合以上的多个操作
  • @CacheConfig:在类级别共享缓存的相同配置

1.简单整合

1. Maven坐标
		<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>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

2.配置

在 application.properties 配置文件中指定缓存类型为 Redis
在这里插入图片描述

在启动类上添加注解 @EnableCaching
在这里插入图片描述

3. 测试

在这里插入图片描述
在这里插入图片描述

2. 自定义整合

2.1 自定义生成的key

在注解的 key 属性中进行配置,且接受 SpEL 语法

 @Cacheable(value = {"testCache"},key = "#root.method.name") //#root.method.name表示使用当前方法名作为key
2.2 自定义缓存的数据的存活时间

在 application.properties 配置文件中进行配置
在这里插入图片描述

2.3 自定义保存数据的格式(默认是java的序列化数据)

大致原理:

Created with Raphaël 2.2.0 CacheAutoConfiguration RedisCacheConfiguration 自动配置了RedisCacheManager 初始化所有的缓存 每个缓存确定使用什么配置 如果redisCacheConfiguration有就用已有的,没有则用默认配置 更改缓存的配置属性,只需给容器注入RedisCacheConfiguration 注入自定义的RedisCacheConfiguration后,就会应用到当前RedisCacheManager管理的所有缓存分区中

自定义缓存配置类

package com.atguigu.gulimall.product.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * 描述:
 * 缓存配置
 *
 * @author XueGuCheng
 * @create 2021-01-21 19:10
 */
@EnableConfigurationProperties(CacheProperties.class)//对配置文件的配置进行属性绑定
@Configuration
@EnableCaching//不需要在启动类在表明该注解
public class MyCacheConfig {

    @Autowired
    CacheProperties cacheProperties;

    @Bean
    RedisCacheConfiguration redisCacheConfiguration(){
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        //指定数据过期时间
//        config = config.entryTtl(Duration.ofDays());
        //指定key的缓存格式
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        //指定value的缓存格式为JSON
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        //使 application.properties 配置文件的配置生效
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }




}

3. 常见配置属性

在这里插入图片描述

总结

SpringCache在并发读模式下的问题:

  • 缓存穿透:查询一个null数据。用缓存空数据解决
  • 缓存击穿:大量并发查询一个正好过期的数据。用加锁(提供了本地锁属性,即只锁当前节点)方式解决
  • 缓存雪崩:大量key同时过期。过期时间 + 随机时间 解决

SpringCache在并发写模式下的问题:
SpringCache对并发写模式下的问题的解决方案的支持度不高

总而言之:SpringCache适合常规数据(读多写小,即时性,一致性要求不高的数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值