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

相关推荐
莫得感情 o2 小时前
Redis 05 · 持久化:RDB 与 AOF 怎么保证数据不丢
redis·缓存
curd_boy3 小时前
【Redis】Redis从缓存到AI向量平台
人工智能·redis·缓存
kiracrimson3 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
莫得感情 o4 小时前
Redis 02 · 数据结构:String 到 Stream 怎么选
redis
devpotato5 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
wxwx_bscxy3226 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
2601_962301017 小时前
深入理解缓存(Cache):原理、应用与优化
缓存·计算机原理·优化策略·数据访问·系统性能
数智启示录8 小时前
PostgreSQL 计划缓存实战(第 10 篇):预编译 SQL 前五次都快,第六次为什么可能变慢
经验分享·sql·缓存·postgresql·面试
cfm_29148 小时前
Spring事务
数据库·spring·oracle
NeverFear79210 小时前
【黑马点评】短信登录
java·redis·tomcat·intellij-idea