騰訊云智實(shí)習(xí)面經(jīng)(帶答案)
1)手撕:給定字符串,求不含重復(fù)字符的最長(zhǎng)子串長(zhǎng)度,并打印這個(gè)子串
//哈希Set配合雙指針
private static String findLongestSubstring(String s) {
int n = s.length();
int left = 0;
int maxLength = 0;
String longestSubstring = "";
Set<Character> charSet = new HashSet<>();
for(int right = 0 ; right < n ; right ++){
while(charSet.contains(s.charAt(right))){
charSet.remove(s.charAt(left));
left++;
}
charSet.add(s.charAt(right));
if(maxLength < right - left + 1){
maxLength = right - left + 1;
longestSubstring = s.substring(left , right + 1);
}
}
return longestSubstring;
}
2)如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)?
從以下角度考慮:
1.高性能架構(gòu);采用分布式架構(gòu),消息隊(duì)列來(lái)削峰填谷,服務(wù)的降級(jí)和熔斷
2.高并發(fā)的處理能力:商品庫(kù)存扣減的多線程安全問(wèn)題,采用redisson分布式鎖,緩存預(yù)熱
3.用戶體驗(yàn)升級(jí):websocket實(shí)現(xiàn)秒殺倒計(jì)時(shí)同步,消息隊(duì)列實(shí)現(xiàn)秒殺結(jié)果實(shí)時(shí)反饋,針對(duì)ip地址,設(shè)備指紋和訪問(wèn)頻率的限制實(shí)現(xiàn)防作弊系統(tǒng)
4.數(shù)據(jù)一致性保障;數(shù)據(jù)庫(kù)分庫(kù)分表,本地消息表
5.監(jiān)控報(bào)警:監(jiān)控系統(tǒng),報(bào)警系統(tǒng),日志系統(tǒng),異常日志收集,分布式追蹤系統(tǒng)
6.安全防護(hù)、成本控制
3)String StringBuffer StringBuilder區(qū)別
String是不可變類,線程安全,每次修改字符串都會(huì)創(chuàng)建新的字符串,效率比較低
StringBuffer是可變類,直接在原字符串上修改,使用了Synchronized實(shí)現(xiàn)同步,效率也比較低,適合多線程場(chǎng)景
StringBuilder是可變類,線程不安全,效率比較高,適合單線程場(chǎng)景
4)數(shù)據(jù)庫(kù)字段char和varchar區(qū)別
char:定長(zhǎng)字符串,存儲(chǔ)長(zhǎng)度為1~255個(gè)字符,存儲(chǔ)空間固定為255字節(jié),不足用空格補(bǔ),適合固定長(zhǎng)度的字段,便于數(shù)據(jù)庫(kù)讀取和優(yōu)化
varchar:可變字符串,存儲(chǔ)長(zhǎng)度為1~65535個(gè)字符,存儲(chǔ)空間為實(shí)際長(zhǎng)度+長(zhǎng)度字節(jié)
5)索引失效的情況
索引失效是指數(shù)據(jù)庫(kù)在查詢過(guò)程中無(wú)法有效利用已建立的索引,導(dǎo)致查詢性能下降,甚至退化為全表掃描的情況。
查詢條件中使用了函數(shù)或表達(dá)式對(duì)索引列進(jìn)行操作;
使用了OR條件且未對(duì)所有分支列建立索
查詢條件中使用了NOT、<>、!=等否定操作符;
對(duì)索引列進(jìn)行了模糊查詢(如LIKE '%abc%'),且通配符位于開(kāi)頭;
查詢條件中列的順序與復(fù)合索引的列順序不匹配;
或者查詢時(shí)數(shù)據(jù)類型不匹配導(dǎo)致索引無(wú)法使用。
6)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別
讀未提交:允許讀取尚未提交的數(shù)據(jù),可能導(dǎo)致臟讀、幻讀、不可重復(fù)讀
讀已提交:允許讀取已提交的數(shù)據(jù),不能保證數(shù)據(jù)一致,可能導(dǎo)致幻讀和不可重復(fù)讀
可重復(fù)讀:允許讀取已提交數(shù)據(jù),可能導(dǎo)致幻讀
串行化:保證數(shù)據(jù)一致性,但是并發(fā)度和性能低
7)Redis的常用數(shù)據(jù)類型,分別存儲(chǔ)哪些東西?
String:存儲(chǔ)字符串,比如用戶名、密碼和驗(yàn)證碼等
哈希:哈希表,可以存儲(chǔ)用戶信息,商品信息等
List:存儲(chǔ)有序的元素,比如消息隊(duì)列和日志記錄
Set:集合,可以做去重排序或求交集等
Zset:帶得分排序的集合,可以做用戶或者流量等的排行榜
8)Redis的鎖機(jī)制
基于SETNX命令,將鎖名稱作為鍵,客戶端唯一標(biāo)識(shí)(UUID)作為鍵值,使用完鎖后DEL釋放鎖
因不可沖入可能存在死鎖和不及時(shí)釋放鎖的情況,可以釋放鎖時(shí)檢查鎖值是否為自己的UUID以及添加過(guò)期時(shí)間
基于Lua腳本,使用原子SET命令和Lua腳本的事務(wù)性,但仍存在鎖續(xù)期困難和業(yè)務(wù)超時(shí)鎖釋放風(fēng)險(xiǎn)
基于Redisson的分布式鎖,支持可沖入鎖和自動(dòng)續(xù)期,提供公平鎖、聯(lián)鎖和紅鎖
9)HTTP1.0 2.0 3.0 區(qū)別
HTTP1.0:默認(rèn)為短連接,每次請(qǐng)求都需要建立TCP連接,并通過(guò)Connection: keep-alive頭來(lái)實(shí)現(xiàn)持久連接,不支持管道 化,主要使用If-Modified-Since/Expires來(lái)做為緩存判斷的標(biāo)準(zhǔn);
HTTP2.0:采用二進(jìn)制格式而非文本格式,解析更加高效,支持多路復(fù)用允許單個(gè)TCP交錯(cuò)發(fā)送多個(gè)請(qǐng)求和響應(yīng),引入HPA CK壓縮算法,對(duì)請(qǐng)求和響應(yīng)的頭部信息進(jìn)行壓縮,消除冗余,允許客戶端為請(qǐng)求設(shè)置優(yōu)先級(jí)
HTTP3.0: 最新的HTTP協(xié)議,基于QUIC協(xié)議,QUIC使用udp傳輸數(shù)據(jù),不存在隊(duì)頭阻塞問(wèn)題,首次連接后具備0RTT優(yōu) 勢(shì),減少延遲,允許網(wǎng)絡(luò)切換時(shí),將連接遷移到新的IP地址,默認(rèn)采用TLS加密,保證數(shù)據(jù)傳輸?shù)陌踩?br />
10) TCP的三次握手和四次揮手,為什么需要?
三次握手:客戶端向服務(wù)器發(fā)送SYN表示請(qǐng)求同步,服務(wù)器向客戶端發(fā)送SYN+ACK表示確認(rèn)收到同步請(qǐng)求,可以確保客戶 端的發(fā)送能力正常,客戶端向服務(wù)器發(fā)送ACK表示確認(rèn),可以確認(rèn)服務(wù)器的發(fā)送和接收能力以及客戶端的接收能力正常,
連接建立,通過(guò)三次握手能夠保證通信雙方的接收發(fā)送能力正常
四次揮手:客戶端發(fā)送FIN+x序列號(hào)表示請(qǐng)求關(guān)閉連接,服務(wù)器發(fā)送ACK+x+1表示確認(rèn)收到,客戶端向服務(wù)器的通道關(guān) 閉,服務(wù)器發(fā)送FIN+y序列號(hào)表示請(qǐng)求關(guān)閉連接,客戶端發(fā)送ACK+y+1表示收到,等待2MSL沒(méi)有收到回復(fù)后關(guān)閉TCP連接,因?yàn)門CP是全雙工的,雙向鏈路分別需要發(fā)送和接收兩次,所以是需要四次揮手。
11) 從輸入網(wǎng)址,到最后訪問(wèn)頁(yè)面的全過(guò)程
首先輸入U(xiǎn)RL,進(jìn)行URL解析,準(zhǔn)備發(fā)送http請(qǐng)求
在請(qǐng)求之前,先本地查看瀏覽器緩存,如果緩存有該資源,直接返回,否則繼續(xù)準(zhǔn)備請(qǐng)求
發(fā)送請(qǐng)求之前,進(jìn)行DNS域名解析,按照本地緩存,本地HOST,路由器緩存,DNS服務(wù)器,DNS根服務(wù)器順序,直到查 詢到URL對(duì)應(yīng)的IP地址
三次握手建立TCP連接
構(gòu)建請(qǐng)求并發(fā)送,包括請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體,并把和該域名相關(guān)的cookie放入請(qǐng)求頭,構(gòu)建HTTP請(qǐng)求,如果是https 還要進(jìn)行加密
服務(wù)器處理請(qǐng)求,生成對(duì)應(yīng)的響應(yīng)并返回相應(yīng)資源
四次握手關(guān)閉TCP連接
瀏覽器接收到響應(yīng)后進(jìn)行解析處理,如果是字節(jié)流可能是下載管理器進(jìn)行下載,如果是html頁(yè)面就是進(jìn)行渲染生成頁(yè)面。
//哈希Set配合雙指針
private static String findLongestSubstring(String s) {
int n = s.length();
int left = 0;
int maxLength = 0;
String longestSubstring = "";
Set<Character> charSet = new HashSet<>();
for(int right = 0 ; right < n ; right ++){
while(charSet.contains(s.charAt(right))){
charSet.remove(s.charAt(left));
left++;
}
charSet.add(s.charAt(right));
if(maxLength < right - left + 1){
maxLength = right - left + 1;
longestSubstring = s.substring(left , right + 1);
}
}
return longestSubstring;
}
2)如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)?
從以下角度考慮:
1.高性能架構(gòu);采用分布式架構(gòu),消息隊(duì)列來(lái)削峰填谷,服務(wù)的降級(jí)和熔斷
2.高并發(fā)的處理能力:商品庫(kù)存扣減的多線程安全問(wèn)題,采用redisson分布式鎖,緩存預(yù)熱
3.用戶體驗(yàn)升級(jí):websocket實(shí)現(xiàn)秒殺倒計(jì)時(shí)同步,消息隊(duì)列實(shí)現(xiàn)秒殺結(jié)果實(shí)時(shí)反饋,針對(duì)ip地址,設(shè)備指紋和訪問(wèn)頻率的限制實(shí)現(xiàn)防作弊系統(tǒng)
4.數(shù)據(jù)一致性保障;數(shù)據(jù)庫(kù)分庫(kù)分表,本地消息表
5.監(jiān)控報(bào)警:監(jiān)控系統(tǒng),報(bào)警系統(tǒng),日志系統(tǒng),異常日志收集,分布式追蹤系統(tǒng)
6.安全防護(hù)、成本控制
3)String StringBuffer StringBuilder區(qū)別
String是不可變類,線程安全,每次修改字符串都會(huì)創(chuàng)建新的字符串,效率比較低
StringBuffer是可變類,直接在原字符串上修改,使用了Synchronized實(shí)現(xiàn)同步,效率也比較低,適合多線程場(chǎng)景
StringBuilder是可變類,線程不安全,效率比較高,適合單線程場(chǎng)景
4)數(shù)據(jù)庫(kù)字段char和varchar區(qū)別
char:定長(zhǎng)字符串,存儲(chǔ)長(zhǎng)度為1~255個(gè)字符,存儲(chǔ)空間固定為255字節(jié),不足用空格補(bǔ),適合固定長(zhǎng)度的字段,便于數(shù)據(jù)庫(kù)讀取和優(yōu)化
varchar:可變字符串,存儲(chǔ)長(zhǎng)度為1~65535個(gè)字符,存儲(chǔ)空間為實(shí)際長(zhǎng)度+長(zhǎng)度字節(jié)
5)索引失效的情況
索引失效是指數(shù)據(jù)庫(kù)在查詢過(guò)程中無(wú)法有效利用已建立的索引,導(dǎo)致查詢性能下降,甚至退化為全表掃描的情況。
查詢條件中使用了函數(shù)或表達(dá)式對(duì)索引列進(jìn)行操作;
使用了OR條件且未對(duì)所有分支列建立索
查詢條件中使用了NOT、<>、!=等否定操作符;
對(duì)索引列進(jìn)行了模糊查詢(如LIKE '%abc%'),且通配符位于開(kāi)頭;
查詢條件中列的順序與復(fù)合索引的列順序不匹配;
或者查詢時(shí)數(shù)據(jù)類型不匹配導(dǎo)致索引無(wú)法使用。
6)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別
讀未提交:允許讀取尚未提交的數(shù)據(jù),可能導(dǎo)致臟讀、幻讀、不可重復(fù)讀
讀已提交:允許讀取已提交的數(shù)據(jù),不能保證數(shù)據(jù)一致,可能導(dǎo)致幻讀和不可重復(fù)讀
可重復(fù)讀:允許讀取已提交數(shù)據(jù),可能導(dǎo)致幻讀
串行化:保證數(shù)據(jù)一致性,但是并發(fā)度和性能低
7)Redis的常用數(shù)據(jù)類型,分別存儲(chǔ)哪些東西?
String:存儲(chǔ)字符串,比如用戶名、密碼和驗(yàn)證碼等
哈希:哈希表,可以存儲(chǔ)用戶信息,商品信息等
List:存儲(chǔ)有序的元素,比如消息隊(duì)列和日志記錄
Set:集合,可以做去重排序或求交集等
Zset:帶得分排序的集合,可以做用戶或者流量等的排行榜
8)Redis的鎖機(jī)制
基于SETNX命令,將鎖名稱作為鍵,客戶端唯一標(biāo)識(shí)(UUID)作為鍵值,使用完鎖后DEL釋放鎖
因不可沖入可能存在死鎖和不及時(shí)釋放鎖的情況,可以釋放鎖時(shí)檢查鎖值是否為自己的UUID以及添加過(guò)期時(shí)間
基于Lua腳本,使用原子SET命令和Lua腳本的事務(wù)性,但仍存在鎖續(xù)期困難和業(yè)務(wù)超時(shí)鎖釋放風(fēng)險(xiǎn)
基于Redisson的分布式鎖,支持可沖入鎖和自動(dòng)續(xù)期,提供公平鎖、聯(lián)鎖和紅鎖
9)HTTP1.0 2.0 3.0 區(qū)別
HTTP1.0:默認(rèn)為短連接,每次請(qǐng)求都需要建立TCP連接,并通過(guò)Connection: keep-alive頭來(lái)實(shí)現(xiàn)持久連接,不支持管道 化,主要使用If-Modified-Since/Expires來(lái)做為緩存判斷的標(biāo)準(zhǔn);
HTTP2.0:采用二進(jìn)制格式而非文本格式,解析更加高效,支持多路復(fù)用允許單個(gè)TCP交錯(cuò)發(fā)送多個(gè)請(qǐng)求和響應(yīng),引入HPA CK壓縮算法,對(duì)請(qǐng)求和響應(yīng)的頭部信息進(jìn)行壓縮,消除冗余,允許客戶端為請(qǐng)求設(shè)置優(yōu)先級(jí)
HTTP3.0: 最新的HTTP協(xié)議,基于QUIC協(xié)議,QUIC使用udp傳輸數(shù)據(jù),不存在隊(duì)頭阻塞問(wèn)題,首次連接后具備0RTT優(yōu) 勢(shì),減少延遲,允許網(wǎng)絡(luò)切換時(shí),將連接遷移到新的IP地址,默認(rèn)采用TLS加密,保證數(shù)據(jù)傳輸?shù)陌踩?br />
10) TCP的三次握手和四次揮手,為什么需要?
三次握手:客戶端向服務(wù)器發(fā)送SYN表示請(qǐng)求同步,服務(wù)器向客戶端發(fā)送SYN+ACK表示確認(rèn)收到同步請(qǐng)求,可以確保客戶 端的發(fā)送能力正常,客戶端向服務(wù)器發(fā)送ACK表示確認(rèn),可以確認(rèn)服務(wù)器的發(fā)送和接收能力以及客戶端的接收能力正常,
連接建立,通過(guò)三次握手能夠保證通信雙方的接收發(fā)送能力正常
四次揮手:客戶端發(fā)送FIN+x序列號(hào)表示請(qǐng)求關(guān)閉連接,服務(wù)器發(fā)送ACK+x+1表示確認(rèn)收到,客戶端向服務(wù)器的通道關(guān) 閉,服務(wù)器發(fā)送FIN+y序列號(hào)表示請(qǐng)求關(guān)閉連接,客戶端發(fā)送ACK+y+1表示收到,等待2MSL沒(méi)有收到回復(fù)后關(guān)閉TCP連接,因?yàn)門CP是全雙工的,雙向鏈路分別需要發(fā)送和接收兩次,所以是需要四次揮手。
11) 從輸入網(wǎng)址,到最后訪問(wèn)頁(yè)面的全過(guò)程
首先輸入U(xiǎn)RL,進(jìn)行URL解析,準(zhǔn)備發(fā)送http請(qǐng)求
在請(qǐng)求之前,先本地查看瀏覽器緩存,如果緩存有該資源,直接返回,否則繼續(xù)準(zhǔn)備請(qǐng)求
發(fā)送請(qǐng)求之前,進(jìn)行DNS域名解析,按照本地緩存,本地HOST,路由器緩存,DNS服務(wù)器,DNS根服務(wù)器順序,直到查 詢到URL對(duì)應(yīng)的IP地址
三次握手建立TCP連接
構(gòu)建請(qǐng)求并發(fā)送,包括請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體,并把和該域名相關(guān)的cookie放入請(qǐng)求頭,構(gòu)建HTTP請(qǐng)求,如果是https 還要進(jìn)行加密
服務(wù)器處理請(qǐng)求,生成對(duì)應(yīng)的響應(yīng)并返回相應(yīng)資源
四次握手關(guān)閉TCP連接
瀏覽器接收到響應(yīng)后進(jìn)行解析處理,如果是字節(jié)流可能是下載管理器進(jìn)行下載,如果是html頁(yè)面就是進(jìn)行渲染生成頁(yè)面。
全部評(píng)論
你不是c++嗎

你不是c++嗎
相關(guān)推薦

點(diǎn)贊 評(píng)論 收藏
分享

點(diǎn)贊 評(píng)論 收藏
分享
點(diǎn)贊 評(píng)論 收藏
分享
04-24 22:37
門頭溝學(xué)院 Java 點(diǎn)贊 評(píng)論 收藏
分享