Maven依赖
<!--Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
涉及常量
public class CacheNameConstant {
public static final String THIRTY_MINUTES = "thirtyMinutes";
public static final String THIRTY_SECONDS = "thirtySeconds";
}
使用示例
@Service
@Slf4j
@CacheConfig(cacheNames = CacheNameConstant.THIRTY_MINUTES)
public class TestServiceImpl extends ServiceImpl<TestMapper, Test> implements ITestService {
@Cacheable(key = "#objectId", unless = "#result==null")
@Override
public Test getTestByObjectId(String objectId) {
LambdaQueryWrapper<Test> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Test::getObjectId, objectId);
return this.getOne(queryWrapper, false);
}
}
RDM Redis 配置缓存前缀后的缓存结果 图示
配置类代码
import org.springframework.cache.CacheManager;
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.connection.RedisConnectionFactory;
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;
/**
* Redis 配置类
*/
@Configuration
public class RedisConfig {
/**
* 配置缓存管理器
*
* @param factory Redis 线程安全连接工厂
* @return 缓存管理器
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
// 生成两套默认配置,通过 Config 对象即可对缓存进行自定义配置
RedisCacheConfiguration cacheConfig1 = RedisCacheConfiguration.defaultCacheConfig()
// 设置过期时间 10 分钟
.entryTtl(Duration.ofMinutes(30))
// 设置缓存前缀
.prefixKeysWith(String.format("cache:%s:", CacheNameConstant.THIRTY_MINUTES))
// 禁止缓存 null 值
.disableCachingNullValues()
// 设置 key 序列化
.serializeKeysWith(keyPair())
// 设置 value 序列化
.serializeValuesWith(valuePair());
RedisCacheConfiguration cacheConfig2 = RedisCacheConfiguration.defaultCacheConfig()
// 设置过期时间 30 秒
.entryTtl(Duration.ofSeconds(30))
.prefixKeysWith(String.format("cache:%s:", CacheNameConstant.THIRTY_SECONDS))
.disableCachingNullValues()
.serializeKeysWith(keyPair())
.serializeValuesWith(valuePair());
// 返回 Redis 缓存管理器
return RedisCacheManager.builder(factory)
.withCacheConfiguration(CacheNameConstant.THIRTY_MINUTES, cacheConfig1)
.withCacheConfiguration(CacheNameConstant.THIRTY_SECONDS, cacheConfig2)
.build();
}
/**
* 配置键序列化
*
* @return StringRedisSerializer
*/
private RedisSerializationContext.SerializationPair<String> keyPair() {
return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
}
/**
* 配置值序列化,使用 GenericJackson2JsonRedisSerializer 替换默认序列化
*
* @return GenericJackson2JsonRedisSerializer
*/
private RedisSerializationContext.SerializationPair<Object> valuePair() {
return RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
}
}