若依(RuoYi)框架中 Redis 的核心作用、具体应用场景和关键配置逻辑,我会从核心作用分类、实战应用场景、关键配置、优化建议四个维度拆解,覆盖单体版和微服务版的通用逻辑,让你清楚 Redis 在若依中 “做什么、怎么做、怎么优化”。
若依最新前后端分离源码下载:
https://gitee.com/ruoyieleadmin/ruoyi-ele-admin
一、Redis 在若依框架中的核心作用(核心价值)
Redis 作为高性能的内存数据库,是若依框架的核心中间件之一,核心作用可总结为 “提速、解耦、防并发、稳系统”,具体分为四大类:
表格
| 核心作用 | 解决的问题 | 性能 / 稳定性提升效果 |
| 缓存热点数据 | 频繁查询数据库(如字典、菜单、用户信息)导致的性能瓶颈 | 数据库查询 QPS 降低 80%+,接口响应时间从百毫秒级降至毫秒级 |
| 分布式锁 | 分布式环境下(微服务)并发操作(如订单提交、数据修改)的线程安全问题 | 杜绝并发导致的数据重复、脏数据问题,成功率 100% |
| 分布式会话共享 | 多实例部署时用户登录状态无法共享(如 Tomcat 集群) | 实现无状态服务,支持水平扩容,登录状态不丢失 |
| 限流 / 防刷 | 接口被恶意高频调用导致的系统崩溃、数据泄露问题 | 限制接口 QPS,避免恶意请求压垮数据库 / 应用 |
二、Redis 在若依框架中的具体应用场景(实战落地)
1. 热点数据缓存(最核心场景)
若依框架将高频访问、变更少的数据缓存到 Redis,避免频繁查询数据库,核心应用:
- 字典数据缓存:系统字典(如性别、状态、权限类型)是全系统高频使用的数据,若依在
DictTypeServiceImpl中缓存字典: java
运行
// 若依字典缓存核心代码(com.ruoyi.system.service.impl.DictTypeServiceImpl) @Override public List<DictData> selectDictDataByType(String dictType) { // 1. 先查Redis缓存 String key = CacheConstants.SYS_DICT_KEY + dictType; List<DictData> dictDataList = redisCache.getCacheObject(key); if (CollUtil.isNotEmpty(dictDataList)) { return dictDataList; } // 2. 缓存未命中,查数据库 dictDataList = dictDataMapper.selectDictDataByType(dictType); // 3. 存入Redis,设置过期时间(避免缓存雪崩) redisCache.setCacheObject(key, dictDataList, CacheConstants.SYS_DICT_EXPIRE, TimeUnit.MINUTES); return dictDataList; }
- 菜单 / 权限缓存:用户登录后,菜单、按钮权限数据缓存到 Redis,避免每次请求都查数据库,核心 key:
sys:cache:menu:{userId}; - 用户信息缓存:登录用户的基本信息(如用户名、角色、权限)缓存到 Redis,核心 key:
sys:user:{userId}。
2. 分布式会话共享(集群部署必备)
若依框架(尤其是微服务版)通过 Redis 实现用户登录会话共享,核心逻辑:
- 单体版:默认使用 Tomcat 会话,集群部署时切换为 Redis 会话;
- 微服务版:强制使用 Redis 存储 Session,实现网关 / 业务模块间登录状态共享;
- 核心配置(
application.yml): yaml
spring: session: store-type: redis # 会话存储到Redis timeout: 1800s # 会话超时时间(30分钟) redis: host: localhost port: 6379 password: 123456 database: 0 # 会话数据存0号库
3. 分布式锁(解决并发问题)
若依框架在核心业务(如定时任务、数据导入导出、订单操作)中使用 Redis 分布式锁,避免并发冲突,核心实现:
java
运行
// 若依分布式锁核心工具类(com.ruoyi.common.core.redis.RedisLockUtil) public boolean tryLock(String lockKey, long timeout, TimeUnit unit) { String uuid = UUID.randomUUID().toString(); // SET NX EX:不存在则设置,同时设置过期时间(避免死锁) Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, uuid, timeout, unit); return Boolean.TRUE.equals(success); } // 业务中使用示例(定时任务防重复执行) @Override @Scheduled(cron = "0 0 1 * * ?") public void syncData() { String lockKey = "sys:task:syncData"; try { if (redisLockUtil.tryLock(lockKey, 5, TimeUnit.MINUTES)) { // 执行业务逻辑(同步数据) } } finally { // 释放锁 redisLockUtil.unlock(lockKey); } }
4. 接口限流 / 防刷(系统防护)
若依框架通过 Redis 实现接口限流(如登录接口防暴力破解、高频接口防刷),核心实现:
java
运行
// 若依限流注解+Redis实现(com.ruoyi.common.annotation.RateLimiter) @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RateLimiter { int limit() default 10; // 单位时间内最大请求数 int time() default 60; // 时间窗口(秒) String key() default "sys:rateLimit:"; } // 切面实现限流逻辑 @Around("@annotation(rateLimiter)") public Object around(ProceedingJoinPoint point, RateLimiter rateLimiter) throws Throwable { String key = rateLimiter.key() + getIpAddress(); // 1. Redis自增计数 Long count = redisTemplate.opsForValue().increment(key, 1); // 2. 首次设置过期时间 if (count == 1) { redisTemplate.expire(key, rateLimiter.time(), TimeUnit.SECONDS); } // 3. 超过限流阈值,拒绝请求 if (count > rateLimiter.limit()) { throw new ServiceException("请求过于频繁,请稍后再试"); } return point.proceed(); } // 接口使用示例(登录接口限流) @PostMapping("/login") @RateLimiter(limit = 5, time = 60) // 60秒内最多5次登录请求 public AjaxResult login(@RequestBody LoginBody loginBody) { // 登录逻辑 }
5. 其他辅助场景
- 延迟队列:处理异步任务(如短信发送、邮件推送),核心 key:
sys:delay:queue; - 缓存预热 / 刷新:系统启动时预热字典、菜单等热点数据到 Redis,定时刷新缓存(避免缓存击穿);
- 数据临时存储:文件上传 / 下载的临时凭证、导出任务的进度状态等,存入 Redis 避免数据库压力。
三、若依框架 Redis 核心配置(必看)
1. 依赖配置(若依默认集成)
xml
<!-- Redis 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 连接池(提升性能) --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency>
2. 核心配置(application.yml)
yaml
spring: # Redis 基础配置 redis: host: localhost # Redis地址 port: 6379 # 端口 password: 123456 # 密码(生产环境必填) database: 0 # 数据库编号(建议不同业务用不同库,如0:会话,1:缓存,2:锁) timeout: 10000ms # 连接超时时间 # 连接池配置(性能优化核心) lettuce: pool: max-active: 8 # 最大活跃连接数 max-idle: 8 # 最大空闲连接数 min-idle: 0 # 最小空闲连接数 max-wait: -1ms # 最大等待时间(-1表示无限制) # 会话存储到Redis(集群部署必开) session: store-type: redis timeout: 3600s
3. 序列化配置(避免乱码 / 性能问题)
若依框架自定义 Redis 序列化器(默认用 FastJSON),核心代码:
java
运行
// com.ruoyi.framework.config.RedisConfig @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); // 序列化配置(key:String,value:JSON) StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); // key 序列化 redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); // value 序列化 redisTemplate.setValueSerializer(fastJsonRedisSerializer); redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; }
四、Redis 使用优化建议(生产环境必看)
- 缓存策略优化:
- 缓存击穿:热点数据设置永不过期,或加互斥锁;
- 缓存雪崩:不同缓存设置不同过期时间(如随机加 1-5 分钟),避免同时失效;
- 缓存穿透:空值缓存(如查询无结果时,缓存空值并设置短过期时间),或布隆过滤器。
- 性能优化:
- 连接池:调整
max-active(建议 10-20)、max-idle,避免频繁创建连接; - 序列化:优先使用 FastJSON/Jackson 序列化,避免 JDK 序列化(体积大、性能差);
- 批量操作:使用
pipeline批量读写,减少网络 IO。
- 安全优化:
- 密码:生产环境必须设置 Redis 密码,禁止空密码;
- 防火墙:限制 Redis 仅允许应用服务器访问,禁止公网暴露;
- 数据备份:开启 Redis 持久化(RDB+AOF),定期备份数据。
- 监控告警:
- 监控 Redis 内存使用率、命中率、连接数;
- 内存使用率超过 80% 时告警,避免内存溢出。
总结
Redis 在若依框架中的核心价值可归纳为:
- 性能核心:缓存热点数据,将数据库高频查询转为 Redis 内存查询,大幅提升接口响应速度;
- 稳定性核心:分布式锁解决并发问题,分布式会话支持集群部署,限流防刷保护系统不被压垮;
- 扩展性核心:延迟队列、临时存储等场景,提升系统异步处理能力和扩展性;
- 配置关键:合理配置连接池、序列化方式、过期时间,是 Redis 高效稳定运行的基础。