使用@cacheable的属性中没有设置过期时间的,接下来解决:
1.使用cacheable注解简化缓存操作
1.1 在pom文件中导入redis依赖
1.2 application.yum(springboot的配置文件)中配置redis(直连或哨兵或分片--)
1.3 按道理 使用cacheable不用写配置类,所以实体类要实现序列化接口,但是由于现在要设置过期时间,所以要写配置类,不实现序列化接口也可以
1.4 在启动类加注解@EnableCaching
2、可以设置缓存随机过期时间的配置类写法:
import org.springframework.cache.CacheManager;
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.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import java.time.Duration;
import java.util.Random;
@Configuration
@EnableCaching
public class CacheConfig {
private static final int MIN_EXPIRY_SECONDS = 300; // 最小过期时间(秒)
private static final int MAX_EXPIRY_SECONDS = 600; // 最大过期时间(秒)
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
return RedisCacheManager.builder(redisCacheWriter)
.cacheDefaults(redisCacheConfiguration())
.build();
}
private RedisCacheConfiguration redisCacheConfiguration() {
return RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()))
.entryTtl(randomExpiry()); // 设置随机过期时间
}
private Duration randomExpiry() {
int expirySeconds = new Random().nextInt((MAX_EXPIRY_SECONDS - MIN_EXPIRY_SECONDS) + 1) + MIN_EXPIRY_SECONDS;
return Duration.ofSeconds(expirySeconds);
}
}
3.展示结果
3.1
3.2 访问
3.3 redis可视化工具查看过期时间