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());
          
          }

效果展示

相关推荐
Dicky-_-zhang17 分钟前
系统容量规划与压测实战:从1万到100万QPS的科学扩容
java·jvm
Highcharts.js5 小时前
倒置百分比堆叠面积图表示列详解|Highcharts大气成分图表代码
开发语言·信息可视化·highcharts·图表开发·面积图·图表示例·推叠图
csdn_aspnet6 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
Dicky-_-zhang6 小时前
消息队列Kafka/RocketMQ选型与高可用架构:从单体到100万TPS的演进
java·jvm
晨曦中的暮雨6 小时前
4.15腾讯 CSIG云服务产线 一面
java·开发语言
存在morning6 小时前
【GO语言开发实践】二 GO 并发快速上手
大数据·开发语言·golang
fake_ss1986 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
茉莉玫瑰花茶6 小时前
工作流的常见模式 [ 1 ]
java·服务器·前端
未若君雅裁6 小时前
Spring AOP、日志切面与声明式事务原理
java·后端·spring
No8g攻城狮7 小时前
【人大金仓】wsl2+ubuntu22.04安装人大金仓数据库V9
java·数据库·spring boot·非关系型数据库