摘要:優化結果計算機器六代內存時間秒優化版本使用存放用戶,通過命令獲取下級時間復雜度,是所有給定集合的成員數量之和。
0x01
我們有一個業務場景是需要將用戶邀請的下級用戶根據其用戶等級給統計出來(不止統計一級).
現有的解決方案:
mysql中一張用戶表
主要的3個字段:user_id, parent _id,level,
典型的一個樹形結構.
因為數據量很大,查詢次數很多,所以重算這數據基本上重算一次要花個幾分鐘.
優化版本1:
假如我將沒所有用戶對應的所有直接下級用戶的id取出,存放到redis中的數組,像這樣
U:110->[111,112,113,...]
將用戶等級也放到redis中,像這樣
L:110->0
然后通過map的方式取到下級的下級用戶并合并起來,再通過用戶等級進行分組。
users.stream.map(u-> jedis.lrange(0,-1)).flatMap(u-> u).collect(grouppingBy(u-> jedis.get("L:" + u)))...
LRANGE
時間復雜度:O(S+N),?S?為偏移量?start?,?N?為指定區間內元素的數量。`
優化結果:
計算機器:I5 六代 8G內存
時間:25秒
優化版本2:
使用Set存放用戶,通過SUNION命令獲取下級ID
時間復雜度:O(N),?N?是所有給定集合的成員數量之和。
獲取當前下級的用戶代碼則更簡單了,首先將當前用戶通過CPU并行的方式把SET的key計算出來,然后通過SUNION將所有的用戶取出來:
private SetdownLevelAllUser(Set users) { return jedis.sunion(users.parallelStream().map(s -> "U:" + s ).collect(Collectors.toList()).toArray(new String[0])); }
這些用戶的等級都查出來,那就獲取他們的用戶等級并進行分組.
private Map> groupUser(Set users) { return jedis.mget(users.parallelStream().map(u -> "L:" + u) .collect(Collectors.toList()).toArray(new String[0])) .parallelStream().collect(Collectors.groupingBy(r -> r)); }
主要功能都實現了,那么試試計算8級所花時間
public List
優化結果:
總用戶數為:120W
計算機器:I5 六代 8G內存
時間:4秒
好了,優化完畢了,大神們還有什么高招,歡迎來指導!!!!!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65930.html
閱讀 3601·2021-11-23 09:51
閱讀 1473·2021-11-04 16:08
閱讀 3547·2021-09-02 09:54
閱讀 3616·2019-08-30 15:55
閱讀 2594·2019-08-30 15:54
閱讀 958·2019-08-29 16:30
閱讀 2047·2019-08-29 16:15
閱讀 2317·2019-08-29 14:05