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

效果展示

相关推荐
半瓶榴莲奶^_^1 小时前
jvm java虚拟机
java·jvm
Gofarlic_oms16 小时前
利用API实现ANSYS许可证管理自动化集成
运维·服务器·开发语言·matlab·自动化·负载均衡
AI+程序员在路上7 小时前
VS Code 完全使用指南:下载、安装、核心功能与 内置AI 编程助手实战
开发语言·人工智能·windows·开源
invicinble7 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
catchadmin7 小时前
使用 PHP TrueAsync 改造 Laravel 协程异步化的可行路径
开发语言·php·laravel
wbs_scy7 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
ss2737 小时前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
try2find8 小时前
打印ascii码报错问题
java·linux·前端
014-code8 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库