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

相关推荐
无心水1 天前
【分布式利器:分布式ID】6、中间件方案:Redis/ZooKeeper分布式ID实现
redis·分布式·zookeeper·中间件·分库分表·分布式id·分布式利器
后端小张1 天前
【JAVA进阶】Spring Boot 核心知识点之自动配置:原理与实战
java·开发语言·spring boot·后端·spring·spring cloud·自动配置
j***51891 天前
Redis 安装及配置教程(Windows)【安装】
数据库·windows·redis
A***F1571 天前
Redis开启远程访问
数据库·redis·缓存
7***37451 天前
后端中间件趋势:消息队列与缓存的新发展
缓存·中间件
j***29481 天前
Redis 设置密码(配置文件、docker容器、命令行3种场景)
数据库·redis·docker
8***84821 天前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
boonya1 天前
Java中Plugin设计模式的规范应用
java·spring·设计模式·插件模式
瑞思蕊萌1 天前
redis实战篇--完结篇
数据库·redis·缓存
o***59271 天前
Spring 过滤器:OncePerRequestFilter 应用详解
java·后端·spring