柚见(伙伴匹配系统)第六期

news2024/11/25 4:40:12

开发主页

  1. 开发主页(默认推荐和自己兴趣相当的用户)
  2. 优化主页的性能(缓存 + 定时任务 + 分布式锁)

前端recommend

最简单:直接 list 列表
cv searchResult页面的代码 修改
在这里插入图片描述

后端接口

在这里插入图片描述

数据内容下边距修改

在这里插入图片描述

提取用户信息卡片

便于复用组件

新建文件夹components和文件UserCardList.vue,将主页用户信息卡片提取出来。主页和用户信息搜索页进行引用。

在这里插入图片描述

<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 "../assets/user";  
interface UserCardListProps{  
  userList:userType;  
}  
  
const props=withDefaults(defineProps<UserCardListProps>(),{  
  //@ts-ignore  
  userList:[] as userType,  
})  
  
</script>

使用用户信息组件

<user-card-list :user-list="userList"></user-card-list>

后台数据库存放大量数据

模拟 1000 万个用户,再去查询

  1. 用可视化界面:适合一次性导入、数据量可控
  2. 写程序:for 循环,建议分批,不要一把梭哈(可以用接口来控制)
    要保证可控、幂等,注意线上环境和测试环境是有区别的导入 1000 万条,for i 1000w
  3. 执行 SQL 语句:适用于小数据量

导入导出

可视化导出
这里自己选择导出的文件类型和导出的地方路径。(尽量用CSV,exsl格式的话因为编码因为会乱码。)

在这里插入图片描述

可视化导入

选择要导入的文件
(导入有风险,自己要想清楚用何种方式导入数据)
在这里插入图片描述

上述演示失败

使用代码导入导出数据

CPU 密集型:分配的核心线程数 = CPU - 1
IO 密集型:分配的核心线程数可以大于 CPU 核数

定时任务 && 线性插入

开启定时任务注解。
在这里插入图片描述

新建InsertUser.java

编写定时任务代码并进行测试(这里的定时取巧,尽量别用,注释掉。)
// @Scheduled(initialDelay = 5000,fixedRate = Long.MAX_VALUE )

@Component  
public class InsertUsers {  
  
@Resource  
private UserMapper userMapper;  
  
/**  
* 循环插入用户  
*/  
// @Scheduled(initialDelay = 5000,fixedRate = Long.MAX_VALUE )  
public void doInsertUser() {  
//统计用户执行时间  
StopWatch stopWatch = new StopWatch();  
stopWatch.start();  
  
final int INSERT_NUM = 1000;  
for (int i = 0; i < INSERT_NUM; i++) {  
User user = new User();  
user.setUsername("模拟用户");  
user.setUserAccount("fakeUser");  
user.setAvatarUrl("https://pic.imgdb.cn/item/65b8f58d871b83018a468905.png");  
user.setProfile("我是一个假用户");  
user.setGender(0);  
user.setPassword("12345678");  
user.setUserPhone("123456789108");  
user.setEmail("shayu-yusha@qq.com");  
user.setStatus(0);  
user.setUserRole(0);  
user.setPlanetCode("931");  
user.setTags("[前端er,JavaEr]");  
userMapper.insert(user);  
}  
stopWatch.stop();  
// 输出任务执行时间  
System.out.println( stopWatch.getLastTaskTimeMillis());  
  
}  

}

for 循环插入数据的问题:

  1. 建立和释放数据库链接,每次都要访问(----批量查询解决)
  2. for 循环是绝对线性的(—并发解决 )

批量查询插入

/**  
* 循环插入用户 耗时:7260ms  
* 批量插入用户 1000 耗时: 4751ms  
*/  
@Test  
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("fakeUser");  
user.setAvatarUrl("https://pic.imgdb.cn/item/65b8f58d871b83018a468905.png");  
user.setProfile("我是一个假用户");  
user.setGender(0);  
user.setPassword("12345678");  
user.setUserPhone("123456789108");  
user.setEmail("shayu-yusha@qq.com");  
user.setStatus(0);  
user.setUserRole(0);  
user.setPlanetCode("931");  
user.setTags("[前端er,JavaEr]");  
userList.add(user);  
}  
//每隔100条数据插入一次  
userService.saveBatch(userList,100);  
  
stopWatch.stop();  
System.out.println( stopWatch.getLastTaskTimeMillis());  
  
}

并发插入

并发执行,
这里的线程可自定义或者用idea默认的,
两种方法的区别是,自定义可以跑满线程,而默认的只能跑CPU核数-1,
代码区别:就是在异步执行处加上自定义的线程名

用户插入单元测试,注意打包时要删掉或忽略,不然打一次包就插入一次

并发要注意执行的先后顺序无所谓,不要用到非并发类的集合

自定义线程池

private ExecutorService executorService = new ThreadPoolExecutor(16, 1000, 10000, TimeUnit.MINUTES, new ArrayBlockingQueue<>(10000));

//线程设置  
private ExecutorService executorService = new ThreadPoolExecutor(16, 1000, 10000, TimeUnit.MINUTES, new ArrayBlockingQueue<>(10000));  



/**  
* 并发批量插入用户 100000 耗时: 26830ms  
*/  
@Test  
public void doConcurrencyInsertUser() {  
StopWatch stopWatch = new StopWatch();  
stopWatch.start();  
final int INSERT_NUM = 100000;  
// 分十组  
int j = 0;  
//批量插入数据的大小  
int batchSize = 5000;  
List<CompletableFuture<Void>> futureList = new ArrayList<>();  
// i 要根据数据量和插入批量来计算需要循环的次数。  
for (int i = 0; i < INSERT_NUM/batchSize; i++) {  
List<User> userList = new ArrayList<>();  
while (true){  
j++;  
User user = new User();  
user.setUsername("模拟用户");  
user.setUserAccount("fakeUser");  
user.setAvatarUrl("https://pic.imgdb.cn/item/65b8f58d871b83018a468905.png");  
user.setProfile("我是一个假用户");  
user.setGender(0);  
user.setPassword("12345678");  
user.setUserPhone("123456789108");  
user.setEmail("shayu-yusha@qq.com");  
user.setStatus(0);  
user.setUserRole(0);  
user.setPlanetCode("931");  
user.setTags("[\"前端\",\"后端\"]"); 
userList.add(user);  
if (j % batchSize == 0 ){  
break;  
}  
}  
//异步执行,插入数据  
CompletableFuture<Void> future = CompletableFuture.runAsync(() ->{  
System.out.println("ThreadName:" + Thread.currentThread().getName());  
userService.saveBatch(userList,batchSize);  
},executorService);  
futureList.add(future);  
}  
//等待所有异步任务执行完成  
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[]{})).join();  
//输出任务执行耗时  
stopWatch.stop();  
System.out.println( stopWatch.getLastTaskTimeMillis());  
  
}

分页查询

重启项目,前端主页用户信息会刷不出来,因为数据量过大。

后端接口修改
在这里插入图片描述

(注意一下这里page的依赖是mybatis的)
添加mybatis,注意扫描的包要修改。

前端修改

在这里插入图片描述

效果

在这里插入图片描述

TODO

数据库慢?预先把数据查出来,放到一个更快读取的地方,不用再查数据库了。(缓存)

预加载缓存,定时更新缓存。(定时任务)

多个机器都要执行任务么?(分布式锁:控制同一时间只有一台机器去执行定时任务,其他机器不用重复执行了)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1457291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

沁恒CH32V30X学习笔记06---串口dma接收+空闲中断组合接收数据

DMA 控制器提供 18 个通道,其中 DMA1 包含 7 个通道,DMA2 包含 11 个通道,每个通 道对应多个外设请求,通过设置相应外设寄存器中对应 DMA 控制位 通道映射 dma1 dma2 示例代码 bsp_usart_it.c /** bsp_usart_it.c** Created on: 2024年2月18日* Author: admin*/…

蓝桥杯Java组备赛(四)

高精度加法 import java.math.BigInteger; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);BigInteger a,b;a sc.nextBigInteger();b sc.nextBigInteger();System.out.println(a.add(b));sc.cl…

代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和 [二叉树篇]

代码随想录算法训练营第十七天 LeetCode 110.平衡二叉树题目描述思路参考代码 LeetCode 257. 二叉树的所有路径题目描述思路参考代码 LeetCode 404.左叶子之和题目描述思路参考代码 LeetCode 110.平衡二叉树 题目链接&#xff1a;110.平衡二叉树 文章讲解&#xff1a;代码随想录…

可转债和股票有哪些区别?可转债和股票哪个好?

可转债&#xff0c;全称可转换债券&#xff0c;指的是持有者可以在特定时期、按特定条件&#xff0c;将其转换为特定数量的另一种证券的债券。这种债券可以转换成公司的普通股票。 如果债券持有人看好发债公司股票增值潜力&#xff0c;在宽限期之后可以行使转换权&#xff0c;…

SOLIDWORKS PDM—中央卡列表

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

条码扫描器

介绍 条码扫描器&#xff0c;又称为条码阅读器、条码扫描枪、条形码扫描器、条形码扫描枪及条形码阅读器。它是用于读取条码所包含信息的阅读设备&#xff0c;利用光学原理&#xff0c;把条形码的内容解码后通过数据线或者无线的方式传输到电脑或者别的设备。广泛应用于超市、物…

2024年腾讯云4核8G12M轻量应用服务器测评,2月更新

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

搜维尔科技:分析OptiTrack光学动作捕捉应用领域!

虚拟制作 当今虚拟制作阶段低延迟、超精确摄像机跟踪的事实上的标准。 用于运动科学的 OptiTrack OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。对所有主要数字测力台、EMG 和模拟设备的本机即…

Kernelized Correlation Filters KCF算法原理详解(阅读笔记)(待补充)

KCF 目录 KCF预备知识1. 岭回归2. 循环移位和循环矩阵3. 傅里叶对角化4. 方向梯度直方图&#xff08;HOG&#xff09; 正文1. 线性回归1.1. 岭回归1.2. 基于循环矩阵获取正负样本1.3. 基于傅里叶对角化的求解 2. 使用非线性回归对模型进行训练2.1. 应用kernel-trick的非线性模型…

机构如何搭建一个在线课程教学平台?

随着数字化教育的兴起&#xff0c;越来越多的教育机构开始考虑建立自己的在线课程教学平台。这一趋势不仅顺应了时代的发展&#xff0c;而且为教育行业带来了诸多便利和优势。构建一个在线教学平台可以帮助机构拓宽服务范围、提升教学质量、增强学生体验&#xff0c;并且能够有…

【机器学习】数据清洗——基于Pandas库的方法删除重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

《Solidity 简易速速上手小册》第6章:优化 Gas 消耗和性能(2024 最新版)

文章目录 6.1 理解 Gas 和交易成本6.1.1 基础知识解析更深入的理解优化的关键点 6.1.2 重点案例&#xff1a;优化合约以降低 Gas 成本案例 Demo&#xff1a;创建一个经济高效的财务管理合约案例代码FinancialManagementContract.sol 测试和验证拓展功能 6.1.3 拓展案例 1&#…

【plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.pie绘制饼图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f3a8; 一、饼图初探&#xff1a;基本概念与用途&#x1f4a…

软件测试系列:移动端安卓APP测试必备之ADB命令 (二)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

AD24-Objects元素、特殊复制粘贴、多根走线、自动布线、泪滴

一、Objects元素的隐藏与显示 1、Altium Transparent 2D与Altium Standard 2D的区别 1) Altium Transparent 2D 2) Altium Standard 2D 二、特殊复制粘贴 1、如何把元件带位号、带网络从当前PCB调用到另外的PCB中 三、多根走线与多根走线设置 四、Active Route 的自动布线辅助…

RSA加密,解密,加签及验签

目录 1.说明 2.加密和加签的区别 3.后端加密&#xff0c;解密&#xff0c;加签及验签示例 4.前端加密&#xff0c;解密&#xff0c;加签及验签示例 5.前端加密&#xff0c;后端解密&#xff0c;前端加签&#xff0c;后端验签 6.注意事项 1.说明 RSA算法是一种非对称加密…

压缩感知——革新数据采集的科学魔法

引言&#xff1a; 在数字时代&#xff0c;数据以及数据的收集和处理无处不在。压缩感知(Compressed Sensing, CS)是一种新兴的数学框架&#xff0c;它挑战了我们传统上对数据采集和压缩的看法&#xff0c;给医学图像、天文观测、环境监测等领域带来了颠覆性的影响。但到底什么…

白话微机:5.解释串行接口以及一些考研面试问题

一. 前言&#xff08;回顾世界观&#xff09; 很久很久以前&#xff0c;有这样一个世界&#xff0c;这个世界有着现实世界一样的元素&#xff1a;那里的人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器…

Apache DolphinScheduler中ZooKeeperCDH不兼容问题的解决方案

背景 看到Apache DolphinScheduler社区群有很多用户反馈和讨论这块问题&#xff0c;针对不兼容的问题&#xff0c;不仅需要自己重新编译各一个新包&#xff0c;而且因为默认是使用zk-3.8的配置&#xff0c;所以会出现不兼容问题。使用zk-3.4配置即可适配3.4.x 解决办法&#…

ffmpeg for android编译全过程与遇到的问题

编译前准备 编译环境&#xff1a;Ubuntu16&#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu ffmpeg源码&#xff1a;ffmpeg4.2.2 NDK下载&#xff1a;Android NDK r21e 有条件的最好还是在Liunx平台下编译吧&#xff0c;Windows平台下编译坑更多…