[关闭]
@liruiyi962464 2025-07-26T07:50:52.000000Z 字数 3012 阅读 54

热启动的方式缓存数据到redis

代码


两种方式的对比

特性 CommandLineRunner ApplicationListener<ApplicationReadyEvent>
触发时机 Spring Boot 启动完成后,但应用可能未完全就绪 Spring Boot 应用完全启动后,所有 Bean 已初始化
适用场景 需要尽早执行初始化逻辑,不依赖其他 Bean 的完全就绪 需要确保所有 Bean 已初始化后再执行逻辑
代码简洁性 更简洁,直接实现 run 方法 需要实现接口方法 onApplicationEvent
执行顺序 可以通过 @Order 注解控制执行顺序 同样可以通过 @Order 注解控制执行顺序

总结


1. 使用 CommandLineRunner 实现热加载数据

  1. import org.jeecg.common.util.RedisUtil;
  2. import org.jeecg.modules.train.entity.ZcTrain;
  3. import org.jeecg.modules.train.mapper.ZcTrainMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.CommandLineRunner;
  6. import org.springframework.stereotype.Component;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. @Component
  12. public class RedisDataLoaderWithCommandLineRunner implements CommandLineRunner {
  13. @Autowired
  14. private ZcTrainMapper zcTrainMapper;
  15. @Autowired
  16. private RedisUtil redisUtil;
  17. @Override
  18. public void run(String... args) throws Exception {
  19. // 缓存列车数据到 Redis
  20. loadTrainDataToRedis();
  21. }
  22. private void loadTrainDataToRedis() {
  23. // 查询所有列车数据
  24. List<ZcTrain> zcTrainList = zcTrainMapper.selectList(null);
  25. // 按列车编号分组
  26. Map<String, List<ZcTrain>> zcTrainMap = new HashMap<>();
  27. if (zcTrainList != null && !zcTrainList.isEmpty()) {
  28. for (ZcTrain zcTrain : zcTrainList) {
  29. zcTrainMap.computeIfAbsent(zcTrain.getTrainNum(), k -> new ArrayList<>()).add(zcTrain);
  30. }
  31. }
  32. // 存入 Redis
  33. redisUtil.set("zcTrainMap", zcTrainMap);
  34. System.out.println("列车数据已加载到 Redis,键为: zcTrainMap");
  35. }
  36. }

说明:


2. 使用 ApplicationListener 实现热加载数据

  1. import org.jeecg.common.util.RedisUtil;
  2. import org.jeecg.modules.train.entity.ZcTrain;
  3. import org.jeecg.modules.train.mapper.ZcTrainMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.context.event.ApplicationReadyEvent;
  6. import org.springframework.context.ApplicationListener;
  7. import org.springframework.stereotype.Component;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. @Component
  13. public class RedisDataLoaderWithApplicationListener implements ApplicationListener<ApplicationReadyEvent> {
  14. @Autowired
  15. private ZcTrainMapper zcTrainMapper;
  16. @Autowired
  17. private RedisUtil redisUtil;
  18. @Override
  19. public void onApplicationEvent(ApplicationReadyEvent event) {
  20. // 缓存列车数据到 Redis
  21. loadTrainDataToRedis();
  22. }
  23. private void loadTrainDataToRedis() {
  24. // 查询所有列车数据
  25. List<ZcTrain> zcTrainList = zcTrainMapper.selectList(null);
  26. // 按列车编号分组
  27. Map<String, List<ZcTrain>> zcTrainMap = new HashMap<>();
  28. if (zcTrainList != null && !zcTrainList.isEmpty()) {
  29. for (ZcTrain zcTrain : zcTrainList) {
  30. zcTrainMap.computeIfAbsent(zcTrain.getTrainNum(), k -> new ArrayList<>()).add(zcTrain);
  31. }
  32. }
  33. // 存入 Redis
  34. redisUtil.set("zcTrainMap", zcTrainMap);
  35. System.out.println("列车数据已加载到 Redis,键为: zcTrainMap");
  36. }
  37. }

说明:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注