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

相关推荐
AAA修煤气灶刘哥20 小时前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
christine-rr1 天前
linux常用命令(4)——压缩命令
linux·服务器·redis
麦兜*1 天前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
麦兜*1 天前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
-Xie-1 天前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存
七夜zippoe1 天前
缓存与数据库一致性实战手册:从故障修复到架构演进
数据库·缓存·架构
青衫客361 天前
Spring异步编程- 浅谈 Reactor 核心操作符
java·spring·响应式编程
凯子坚持 c1 天前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list
weixin_456904271 天前
跨域(CORS)和缓存中间件(Redis)深度解析
redis·缓存·中间件
波波烤鸭1 天前
Redis 高可用实战源码解析(Sentinel + Cluster 整合应用)
数据库·redis·sentinel