SpringCache使用

Spring为我们提供了工具解决缓存读取,和数据同步问题。

参考:https://www.jianshu.com/p/6db623355e11 写的很给力

1、引入jar

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

2、application.yml

spring:
  redis:
    open: true  # 是否开启redis缓存  true开启   false关闭
    database: 0
    host: ilove   #主机地址写自己的
    #    host: localhost
    port: 6379
    password:    # 密码(默认为空)
    timeout: 60000ms  # 连接超时时长(毫秒)
    jedis:
      pool:
        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-idle: 10      # 连接池中的最大空闲连接
        min-idle: 5       # 连接池中的最小空闲连接
server:
  port: 9977

3、讲解

注解含义:

  1. @EnableCaching 开启SpringCache功能
  2. @Cacheable 修饰方法。在方法执行之前,会先访问缓存找数据,如果有数据会直接返回缓存中的数据,不会执行方法。如果没数据,会执行方法,并且将返回结果存入缓存。
  3. @CacheEvict 触发缓存清理。
  4. @CachePut 与Cacheable有一点类似,都会将方法的执行结果存入缓存。但是@CachePut每次都会执行方法,然后将结果存入缓存。使用场景适用于更新操作。

@Cacheable

属性描述
value缓存的名称
cacheNames缓存的名称 value和cacheNames是一样的
key缓存的键的值 ,支持SPEL表达式
keyGenerator缓存的键的生成策略,指定一个bean的名称,这个bean得是KeyGenerator的实现。如果声明了自定义策略,上面的key声明将会失效
condition缓存促发的条件,默认true ,支持SPEL表达式
unless缓存促发条件,在方法之后执行,支持SPEL表达式

SPEL表达式:
上面的key,condition等属性支持SPEL表达式,能够在注解中获取方法名,参数值等属性。具体用法如下:
如果想定义一个普通的key,为popApplication10
在这里插入图片描述
需要注意的是,并不是直接写key=“popApplication10”,能注意到其实还要再内容中加入一个单引号修饰。因为,加了单引号,才表示这是个字符串,否则会被当做SPEL处理,到时候会提示你找不到一个叫popApplication10的对象。

使用方法名+参数写
在这里插入图片描述
自定义KeyGenerator生成key

    /**
     * key的生成策略1
     *  方法名当key
     * @return
     */
    @Bean
    public KeyGenerator nameKeyGenerator() {
        return (Object target, Method method, Object... params) -> method.getName();
    }
    @Cacheable(value = "user", keyGenerator = "nameKeyGenerator",condition = "#root.methodName.length() > 5")
    public String username() {
        return "tzq";
    }

@CacheEvict
删除缓存,这一块可以配合condition使用,满足条件就清理缓存
例如,如果传入了删除数据的id,就清理缓存
在这里插入图片描述

配置缓存的自动过期时间

为了保证数据的准确性。这一块需要注意,我们明显不可能永远从缓存中取数据。
保证缓存数据与数据库数据一至的处理办法除了手动触发缓存更新。还要让缓存有一个过期时间。

    @Primary
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(10))   // 设置缓存过期时间10秒
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
                        GenericJackson2JsonRedisSerializer()));     //

        return RedisCacheManager
                .builder(connectionFactory)
                .cacheDefaults(cacheConfiguration)
                .transactionAware()
                .build();
    }

CacheManager是SpringCache的配置Bean。可以设置过期时间,控制不缓存等属性。

使用CacheManager也可以手动操作缓存的数据。
如:

    @Autowired
    CacheManager cacheManager;

    public String[] values() {
    	//cache为user的cache ,可以执行get或put操作user中的数据。比较简单
        Cache cache = cacheManager.getCache("user");

        return new String[]{
                cache.get("username",String.class),
                cache.get("phone",String.class)
        };
    }
Spring CacheSpring框架提供的一种缓存机制,用于提高应用程序的性能和响应速度。通过使用Spring Cache,可以将方法的返回值缓存起来,当下次调用相同的方法时,可以直接从缓存中获取结果,而不需要再执行方法的逻辑。 在使用Spring Cache时,需要进行一些配置。首先,需要添加Redis的配置信息,包括缓存类型、缓存过期时间、缓存键的前缀等。可以通过设置`spring.cache.type`为`redis`来指定使用Redis作为缓存类型。可以使用`spring.cache.redis.time-to-live`设置缓存的过期时间,单位为毫秒。可以使用`spring.cache.redis.key-prefix`设置缓存键的前缀,如果不指定前缀,则默认使用缓存的名字作为前缀。可以使用`spring.cache.redis.use-key-prefix`设置是否使用前缀,默认为true。可以使用`spring.cache.redis.cache-null-values`设置是否缓存空值,以防止缓存穿透。 另外,Spring Cache还支持使用JCache(JSR-107)注解来简化开发。从Spring 3.1开始,定义了`org.springframework.cache.Cache`和`org.springframework.cache.CacheManager`接口来统一不同的缓存技术。 在使用Spring Cache时,可以通过在方法上添加`@Cacheable`注解来启用缓存功能。当调用带有`@Cacheable`注解的方法时,Spring会首先检查缓存中是否存在相应的结果,如果存在,则直接返回缓存中的结果,如果不存在,则执行方法的逻辑,并将结果存入缓存中。 总结起来,使用Spring Cache可以通过配置Redis等缓存信息,并在方法上添加`@Cacheable`注解来实现缓存功能,提高应用程序的性能和响应速度。 #### 引用[.reference_title] - *1* [SpringCache使用](https://blog.csdn.net/ABestRookie/article/details/121297482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [springcache使用详解(使用redis做分布式缓存)](https://blog.csdn.net/A_art_xiang/article/details/125580962)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值