lack——主页前后端开发优化(精华:java多线程实现数据插入)

lack------主页前后端开发优化

前端开发主页

  1. 最容易的方式:list列表

    js 复制代码
    <template>
      <van-card
          v-for="user in props.userList"
          :desc="user.profile"
          :title="`${user.username} (${user.planetCode})`"
          :thumb="user.avatarUrl"
      >
        <template #tags>
          <van-tag plain type="danger" v-for="tag in user.tags" style="margin-right: 8px; margin-top: 8px">
            {{ tag }}</van-tag>
        </template>
        <template #footer>
          <van-button size="mini">联系我</van-button>
        </template>
      </van-card>
    </template>
    
    <script setup lang="ts">
    import {UserType} from "../models/user";
    
    interface UserCardListProps{
      userList:UserType[];
    }
    
    const props = withDefaults(defineProps<UserCardListProps>(),{
     // @ts-ignore
      userList:[] as UserType[],
    });
    
    </script>
    
    <style scoped>
    
    </style>

后端接口开发(精华:java多线程实现数据插入)

  1. 对接主页接口开发

    java 复制代码
     /**
     * 首页推荐接口
     * @param request
     * @return
     */
    @GetMapping("/recommend")
    public BaseResponse<List<User>> recommendUsers(HttpServletRequest request) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        List<User> userList = userService.list(queryWrapper);
        List<User> list = userList.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList());
        return ResultUtils.success(list);
    }
  2. 优化对接主页接口开发(分页查询)

    java 复制代码
    /**
     * 首页推荐接口(分页查询)
     * @param request
     * @return
     */
    @GetMapping("/recommend")
    public BaseResponse<Page<User>> recommendUsers(long pageSize,long pageNum,HttpServletRequest request) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Page<User> userList = userService.page(new Page<>(pageNum,pageSize),queryWrapper);
        return ResultUtils.success(userList);
    }
  3. 模拟大量用户状态

    • 导入用户数据方式
      1. 可视化界面导入
      2. 执行sql语句
      3. 写程序:使用for循环,可以分批导入(保证可控性)。
        1. 编写一次性任务批量插入(for循环插入数据问题:建立释放连接,for循环是绝对线性的)

          java 复制代码
          @Component //成为spring bean
          public class InsertUsers {
          
          @Resource
          private UserMapper userMapper;
          @Resource
          private UserService userService;
          
          public void doInsertUser(){
          StopWatch stopWatch = new StopWatch();
          stopWatch.start();
          final int INSERT_NUM = 1000;
          List<User> userList = new ArrayList<>();
          for (int i = 0; i < INSERT_NUM; i++) {
              User user = new User();
              user.setUsername("假二哈");
              user.setUserAccount("FakeErha");
              user.setAvatarUrl("https://tse4-mm.cn.bing.net/th/id/OIP-C.DMY4H6Xibxdrzf-hkElvZgHaDu?w=326&h=176&c=7&r=0&o=5&pid=1.7");
              user.setGender(0);
              user.setUserPassword("12345678");
              user.setPhone("13987496799");
              user.setEmail("13987496799@qq.com");
              user.setUserStatus(0);
              user.setUserRole(0);
              user.setPlanetCode("1111111");
              user.setTags("[]");
              userList.add(user);
          
          }
          userService.saveBatch(userList,100);
          stopWatch.stop();
          System.out.println(stopWatch.getTotalTimeMillis()); }
          }
        2. 并发要注意执行的前后顺序无所谓,不要用到非并发类的集合如list

          java 复制代码
          /**
           * 自定义线程池
           * 参数含义:默认多少线程池,最大多少,线程存活时间,线程单位,任务队列
           */
          private ExecutorService executorService = new ThreadPoolExecutor(60,1000, 10000,TimeUnit.MINUTES,new ArrayBlockingQueue<>(10000));
          /**
           * 并发批量插入数据
           */
          public void doConcurrencyInsertUser(){
              StopWatch stopWatch = new StopWatch();
              stopWatch.start();
              int batchSize = 5000;
              //10万条数据分成10组每组1万条
              int j = 0;
              List<CompletableFuture<Void>> futuresList = new ArrayList<>();
               for (int i = 0; i <20; i++) {
                  List<User> userList = Collections.synchronizedList(new ArrayList<>());
                  while (true) {
                      j++;
                      User user = new User();
                      user.setUsername("假二哈呀");
                      user.setUserAccount("FakeErha");
                      user.setAvatarUrl("https://tse4-mm.cn.bing.net/th/id/OIP-C.DMY4H6Xibxdrzf-hkElvZgHaDu?w=326&h=176&c=7&r=0&o=5&pid=1.7");
                      user.setGender(0);
                      user.setUserPassword("12345678");
                      user.setPhone("13987496799");
                      user.setEmail("13987496799@qq.com");
                      user.setUserStatus(0);
                      user.setUserRole(0);
                      user.setPlanetCode("1111111");
                      user.setTags("[]");
                      userList.add(user);
                      if (j % batchSize == 0) {
                          break;
                      }
                  }
                  //新建一个异步的任务,不要返回值,使用此方法里面的操作就是异步的
                  CompletableFuture<Void> feature = CompletableFuture.runAsync(() -> {
                      System.out.println("ThreadName:" + Thread.currentThread().getName());
                      userService.saveBatch(userList, batchSize);
                  },executorService);
                  futuresList.add(feature);
              }
               CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[]{ }));
              stopWatch.stop();
              System.out.println(stopWatch.getTotalTimeMillis());
          
          }

效果展示

相关推荐
需要8267 分钟前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
Kyrie_kk20 分钟前
Java--ProcessBuilder操作系统进程
java·后端
SamDeepThinking25 分钟前
关于java final关键字的可见性
java·后端·面试
quantdash_cc29 分钟前
量化策略为什么需要实时行情数据?从信号产生到交易决策的时间差说起
开发语言·python·数据分析·量化交易·股票数据·quantdash
Wang's Blog1 小时前
Java 项目实战: 外卖平台-MyBatis-Plus分页插件与员工分页查询
java·项目开发
MetaLite1 小时前
全网最好的SpringBoot接口请求对象设计
java·spring boot·后端
蜗牛互联网1 小时前
AI给面试打分不够,求职者更需要可核对的证据
java·人工智能·后端
此时不提桶,更待何时1 小时前
02-05-B-虚拟线程面试与生产事故实战
java·面试
名字还没想好☜1 小时前
Spring Boot 3.2 RestClient 实战:替代 RestTemplate 调外部接口,超时、连接池与错误处理
java·后端·spring
摇滚侠2 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC容器的高级机制 BeanFactoryPostProcessor 个人理解 6
java·spring boot·笔记·后端