import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.function.Supplier;
@Service
public class CacheService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 通用缓存获取方法
* @param cacheKey 缓存键
* @param dataLoader 数据加载器函数
* @return 缓存或数据库中的数据
*/
public <T> T getFromCache(String cacheKey, Supplier<T> dataLoader) {
// 从缓存获取数据
T data = (T) redisTemplate.opsForValue().get(cacheKey);
if (data != null) {
return data;
}
// 缓存未命中,加载数据
data = dataLoader.get();
if (data != null) {
// 放入缓存(永不过期)
redisTemplate.opsForValue().set(cacheKey, data);
}
return data;
}
}
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
// 配置消息监听器容器
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
使用
@Override
@GetMapping(SELECTLIST)
public R<List<MpBannerEntity>> selectMpBannerList() {
String cacheKey = CacheConstant.MP_BANNERS;
List<MpBannerEntity> list = cacheService.getFromCache(cacheKey, () ->
mpBannerService.list(Wrappers.<MpBannerEntity>query().lambda()
.eq(MpBannerEntity::getStatus, 2)
.orderByAsc(MpBannerEntity::getSno))
);
return R.data(list);
}
通过自定义CacheService类提供通用缓存获取方法,结合RedisTemplate实现数据缓存功能。当缓存未命中时,自动调用数据加载函数从数据库获取数据并存入Redis。配置类RedisTemplateConfig设置了键值序列化方式,并初始化了Redis消息监听容器。实际应用示例展示了如何通过注解方式查询轮播图数据,实现"缓存优先"的访问模式,显著提升系统性能。这套方案具有通用性强、使用简便的特点,适用于各类需要缓存加速的业务场景。