成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

我是這樣優(yōu)化用戶關(guān)系查詢的

lauren_liuling / 894人閱讀

摘要:優(yōu)化結(jié)果計算機(jī)器六代內(nèi)存時間秒優(yōu)化版本使用存放用戶,通過命令獲取下級時間復(fù)雜度,是所有給定集合的成員數(shù)量之和。

0x01

我們有一個業(yè)務(wù)場景是需要將用戶邀請的下級用戶根據(jù)其用戶等級給統(tǒng)計出來(不止統(tǒng)計一級).
現(xiàn)有的解決方案:
mysql中一張用戶表
主要的3個字段:user_id, parent _id,level,
典型的一個樹形結(jié)構(gòu).
因為數(shù)據(jù)量很大,查詢次數(shù)很多,所以重算這數(shù)據(jù)基本上重算一次要花個幾分鐘.

0x02

優(yōu)化版本1:
假如我將沒所有用戶對應(yīng)的所有直接下級用戶的id取出,存放到redis中的數(shù)組,像這樣

U:110->[111,112,113,...]

將用戶等級也放到redis中,像這樣

L:110->0

然后通過map的方式取到下級的下級用戶并合并起來,再通過用戶等級進(jìn)行分組。

users.stream.map(u-> jedis.lrange(0,-1)).flatMap(u-> u).collect(grouppingBy(u-> jedis.get("L:" + u)))...

LRANGE
時間復(fù)雜度:O(S+N),?S?為偏移量?start?,?N?為指定區(qū)間內(nèi)元素的數(shù)量。`
優(yōu)化結(jié)果:
計算機(jī)器:I5 六代 8G內(nèi)存
時間:25秒

0x03

優(yōu)化版本2:
使用Set存放用戶,通過SUNION命令獲取下級ID

時間復(fù)雜度:O(N),?N?是所有給定集合的成員數(shù)量之和。

獲取當(dāng)前下級的用戶代碼則更簡單了,首先將當(dāng)前用戶通過CPU并行的方式把SET的key計算出來,然后通過SUNION將所有的用戶取出來:

private Set downLevelAllUser(Set users) {
    return jedis.sunion(users.parallelStream().map(s ->
            "U:" + s
    ).collect(Collectors.toList()).toArray(new String[0]));
}

這些用戶的等級都查出來,那就獲取他們的用戶等級并進(jìn)行分組.

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

主要功能都實現(xiàn)了,那么試試計算8級所花時間

public List> downLevel8UserRole(int start_user) {
        Set u1 = downLevel1Users(start_user);
        Map> m1 = groupUser(u1);
        Set u2 = downLevelAllUser(u1);
        Map> m2 = groupUser(u2);
        Set u3 = downLevelAllUser(u2);
        Map> m3 = groupUser(u3);
        Set u4 = downLevelAllUser(u3);
        Map> m4 = groupUser(u4);
        Set u5 = downLevelAllUser(u4);
        Map> m5 = groupUser(u5);
        Set u6 = downLevelAllUser(u5);
        Map> m6 = groupUser(u6);
        Set u7 = downLevelAllUser(u6);
        Map> m7 = groupUser(u7);
        Set u8 = downLevelAllUser(u7);
        Map> m8 = groupUser(u8);
        return Arrays.asList(m1, m2, m3, m4, m5, m6, m7, m8).parallelStream().map(m -> {
            Map newMap = new HashMap<>();
            m.forEach((k, v) -> newMap.put(k, v.size()));
            return newMap;
        }).collect(Collectors.toList());
    }

優(yōu)化結(jié)果:
總用戶數(shù)為:120W
計算機(jī)器:I5 六代 8G內(nèi)存
時間:4秒

好了,優(yōu)化完畢了,大神們還有什么高招,歡迎來指導(dǎo)!!!!!!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65930.html

相關(guān)文章

發(fā)表評論

0條評論

閱讀需要支付1元查看
<