@cacheable缓存及过期时间设置

@Cacheable是 Spring 框架中用于缓存方法结果的注解。其实现原理主要包括以下几个方面:

一、创建代理对象

当一个类的方法被@Cacheable注解标记后,在 Spring 容器启动时,会通过动态代理机制为该类创建一个代理对象。这个代理对象会拦截对被注解方法的调用。

二、缓存键生成

在方法调用前,Spring 首先会根据缓存配置生成一个缓存键。缓存键的生成可以通过多种方式,例如:
    默认情况下,Spring 会使用方法的参数作为生成缓存键的依据。如果方法有多个参数,会将这些参数组合起来生成一个唯一的键。
    也可以通过自定义键生成器来实现更复杂的键生成逻辑。

三、检查缓存

有了缓存键之后,代理对象会检查对应的缓存中是否已经存在该键对应的缓存值。
    如果缓存中存在该键对应的结果,说明该方法之前已经被调用过并且结果被缓存了起来。此时,代理对象会直接返回缓存中的结果,而不会实际执行被注解的方法。
    如果缓存中不存在该键对应的结果,代理对象会继续执行被注解的方法。

四、缓存结果

当被注解的方法执行完成后,其返回结果会被存储到缓存中。
    存储的过程中,会根据缓存配置设置缓存的过期时间、是否允许存储空值等属性。
这样,下次调用该方法时,如果参数相同,就可以直接从缓存中获取结果,提高了程序的性能。

总之,@Cacheable通过代理对象拦截方法调用、生成缓存键、检查缓存和存储结果等一系列操作,实现了对方法结果的缓存功能,从而减少了重复的方法执行,提高了系统的性能。

可以使用@Cacheable的ttl(time to live)属性来设置缓存过期时间,单位为毫秒:

java
复制

import org.springframework.cache.annotation.Cacheable;
import java.util.concurrent.TimeUnit;

public class MyService {

@Cacheable(cacheNames = "myCache", key = "#param", unless = "#result == null", sync = true, cacheManager = "cacheManager", value = "myValue", ttl = 60000)
public String getValue(String param) {
    // 实际的业务逻辑,这里只是模拟返回一个字符串
    return "Value for " + param;
}

}

在上面的例子中,设置了缓存名为myCache,缓存时间为 60000 毫秒(即 60 秒)。

也可以使用timeUnit属性来指定时间单位:

java
复制

import org.springframework.cache.annotation.Cacheable;
import java.util.concurrent.TimeUnit;

public class MyService {

@Cacheable(cacheNames = "myCache", key = "#param", unless = "#result == null", sync = true, cacheManager = "cacheManager", value = "myValue", ttl = 60, timeUnit = TimeUnit.SECONDS)
public String getValue(String param) {
    // 实际的业务逻辑,这里只是模拟返回一个字符串
    return "Value for " + param;
}

}

这样更加清晰地表明设置的缓存时间为 60 秒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值