redis缓存工具类【当缓存未命中时,自动调用数据加载函数从数据库获取数据并存入Redis】

java 复制代码
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;
    }
}
java 复制代码
@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;
    }
}

使用

java 复制代码
@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消息监听容器。实际应用示例展示了如何通过注解方式查询轮播图数据,实现"缓存优先"的访问模式,显著提升系统性能。这套方案具有通用性强、使用简便的特点,适用于各类需要缓存加速的业务场景。

相关推荐
Spring AI学习7 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
java1234_小锋8 小时前
Spring IoC的实现机制是什么?
java·后端·spring
小小8程序员9 小时前
Redis-10
数据库·redis·缓存
前端小端长10 小时前
Vue 中 keep-alive 组件的原理与实践详解
前端·vue.js·spring
YDS82911 小时前
SpringCould —— 网关详解
后端·spring·spring cloud
老华带你飞12 小时前
列车售票|基于springboot 列车售票系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring
猿与禅13 小时前
Spring Boot 4.0 完整核心特性及实践指南
java·spring boot·后端·spring·重大升级·springboot4.0
运维@小兵14 小时前
Spring-AI系列——Tool Calling获取当前时间
java·后端·spring