成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

兩組數據量相對大時,如何高效進行比對

大數據 新聞
這三種方案,兩層循環效率是最低,而且隨著數據量增大會有OOM的風險。

01 前言

前陣子項目因業務需要,要對接兄弟部門的用戶數據,因為兄弟部門并不提供增量用戶數據接口,每次只能從兄弟部門那邊同步全量用戶數據。全量的用戶數據大概有幾萬條。因為是全量數據,因此我們這邊要做數據比對( 注:  用戶username是唯一),如果同步過來的數據,我們這邊沒有,就要做插入操作,如果我們這邊已經有,就要做更新操作。本文就來聊聊當數據量相對大時,如何進行對比

02 比對邏輯

因用戶username是唯一的,因此我們可以利用用戶username來進行比對匹配

03 比對實現

1.方案一:兩層嵌套循環比對

即:將接口的全量數據和我們數據庫的全量數據進行循環比對

示例

@Override
public void compareAndSave(List<User> users, List<MockUser> mockUsers) {
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
for (MockUser mockUser : mockUsers) {
for (User user : users) {
if(mockUser.getUsername().equals(user.getUsername())){
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User newUser = new User();
BeanUtils.copyProperties(mockUser,newUser);
addUsers.add(newUser);
}
}
}

}

用這種方法,我在測試環境壓了30萬條數據,比對數據等了大概20分鐘后,直接OOM

2.方案二:使用布隆過濾器

即:比對開始前,先將我們這邊的數據壓入布隆過濾器,然后通過布隆過濾器來判定接口數據

示例

@Override
public void compareAndSave(List<User> users,List<MockUser> mockUsers){
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
BloomFilter<String> bloomFilter = getUserNameBloomFilter(users);
for (MockUser mockUser : mockUsers) {
boolean isExist = bloomFilter.mightContain(mockUser.getUsername());
//更新
if(isExist){
User user = originUserMap.get(mockUser.getUsername());
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User user = new User();
BeanUtils.copyProperties(mockUser,user);
addUsers.add(user);
}
}

}

用這種方法,我在測試環境壓了30萬條數據,比對耗時1秒左右

3.方案三:使用list + map比對

即:比對開始前,先將我們這邊數據存放到map中,map的key為username,value為用戶數據,然后遍歷接口數據,進行比對

示例

@Override
public void compareAndSave(List<User> users, List<MockUser> mockUsers) {
Map<String,User> originUserMap = getOriginUserMap(users);
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
for (MockUser mockUser : mockUsers) {
if(originUserMap.containsKey(mockUser.getUsername())){
User user = originUserMap.get(mockUser.getUsername());
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User user = new User();
BeanUtils.copyProperties(mockUser,user);
addUsers.add(user);
}
}
}

用這種方法,我在測試環境壓了30萬條數據,比對耗時350毫秒左右

04 總結

這三種方案,兩層循環效率是最低,而且隨著數據量增大會有OOM的風險。采用布隆過濾器,存在誤判的風險,為了降低誤判風險,只能降低誤判率,可以通過參數指定,但這也增加判斷時間。用map可以說是效率最好,他本質是將時間復雜度從O(n2)降低到O(n)。不過這種方案可能也不是最優方案,事后和朋友討論下,他說可以用啥雙向指針啥,因為我在算法這方面沒有深入研究,因此本文就沒演示了

05 demo鏈接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-comparedata。

責任編輯:張燕妮 來源: Linyb極客之路
相關推薦

2009-12-08 09:21:13

WCF數據量

2024-11-15 09:54:58

2025-01-23 00:00:00

JMMJava

2011-04-18 11:13:41

bcp數據導入導出

2019-09-27 12:44:03

數據建模企業數據存儲

2017-11-22 15:33:56

MySQL快速插入語句優化

2024-01-23 12:56:00

數據庫微服務MySQL

2024-07-30 15:56:42

2013-12-18 11:11:43

UPYUN數據

2021-01-07 07:46:34

MyBatis 數據量JDBC

2024-11-13 15:22:36

Python列表切片

2018-06-01 09:42:43

數據Spark規模

2021-04-07 10:20:31

MySQL數據庫命令

2013-11-20 16:29:41

SAP中國商業同略會DVM

2020-07-19 10:53:42

數據庫MySQL遷移

2022-08-14 14:52:45

數據存儲實踐

2016-10-19 09:25:46

數據庫OracleMySQL

2009-12-08 15:19:58

WCF大數據量

2020-06-29 19:15:54

MySQL 數據量性能

2013-01-11 09:39:56

WLAN3GLTE
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产www成人 | 久久在线 | 一区二区三区免费 | 国产精品久久久久久久久久三级 | 国产中文字幕在线 | 国产精品久久久久久久久久 | 国产一区二区三区 | 羞羞在线视频 | 国产精品久久久久久亚洲调教 | 中文精品一区二区 | 精品视频一区二区三区 | 中文字幕亚洲欧美日韩在线不卡 | 99reav| 毛片免费看的 | 伊色综合久久之综合久久 | 91精品国产综合久久小仙女图片 | 欧美日韩中文在线观看 | 亚洲女优在线播放 | 日韩电影在线 | 超碰高清 | 正在播放国产精品 | www.色五月.com | 一级片免费在线观看 | 欧美日产国产成人免费图片 | 亚洲va国产日韩欧美精品色婷婷 | 91av免费看 | 精品国产免费人成在线观看 | 中文在线一区二区 | 久久综合久久久 | 国产三区精品 | 久久综合一区 | 亚洲一区三区在线观看 | 免费在线观看av片 | www.色.com| 欧美日韩国产精品一区 | 国产综合久久久 | 精品99在线 | 欧美成人一区二区 | 亚洲欧美激情精品一区二区 | 精品国产欧美 | 538在线精品 |