1.線程數(shù)怎么設(shè)置比較合適,為什么要有最大線程數(shù)
CPU密集型N+1侨糟,IO密集型2N碍扔,最大線程要在等待隊(duì)列跑完以后才執(zhí)行,核心線程數(shù)是不銷毀的秕重,最大線程要等隊(duì)列滿了才創(chuàng)建不同,執(zhí)行完后一段時(shí)間未調(diào)用會(huì)銷毀
2.幾種代理模式的區(qū)別,怎么實(shí)現(xiàn)比較好
cglib運(yùn)行時(shí)效率更高溶耘,jdk模式創(chuàng)建時(shí)效率更高二拐,單例或無需頻繁創(chuàng)建的實(shí)例池,用cglib凳兵,反之用jdk
3.Mysql的索引數(shù)據(jù)結(jié)構(gòu)有什么
Hash索引:原理和jdk的hashmap類似百新,缺點(diǎn)是不能范圍查詢
B-樹索引:節(jié)點(diǎn)即存放key也存放data
B+樹索引:只有葉子節(jié)點(diǎn)存放data,其他節(jié)點(diǎn)只存放key
B+樹的磁盤讀寫代價(jià)更低
B+樹的內(nèi)部結(jié)點(diǎn)并沒有指向關(guān)鍵字具體信息的指針庐扫。因此其內(nèi)部結(jié)點(diǎn)相對(duì)B樹更小饭望。如果把所有同一內(nèi)部結(jié)點(diǎn)的關(guān)鍵字存放在同一盤塊中,那么盤塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多形庭。一次性讀入內(nèi)存中的需要查找的關(guān)鍵字也就越多铅辞。相對(duì)來說I/O讀寫次數(shù)也就降低了。
B+樹的查詢效率更加穩(wěn)定
由于內(nèi)部結(jié)點(diǎn)并不是最終指向文件內(nèi)容的結(jié)點(diǎn)萨醒,而只是葉子結(jié)點(diǎn)中關(guān)鍵字的索引斟珊。所以任何關(guān)鍵字的查找必須走一條從根結(jié)點(diǎn)到葉子結(jié)點(diǎn)的路。所有關(guān)鍵字查詢的路徑長(zhǎng)度相同富纸,導(dǎo)致每一個(gè)數(shù)據(jù)的查詢效率相當(dāng)囤踩。
B+樹更有利于對(duì)數(shù)據(jù)庫的掃描
B樹在提高了磁盤IO性能的同時(shí)并沒有解決元素遍歷的效率低下的問題,而B+樹只需要遍歷葉子節(jié)點(diǎn)就可以解決對(duì)全部關(guān)鍵字信息的掃描晓褪,所以對(duì)于數(shù)據(jù)庫中頻繁使用的range query高职,B+樹有著更高的性能
4.消息隊(duì)列,怎么保證數(shù)據(jù)不丟失
生產(chǎn)端:
Producer 的retries設(shè)置次數(shù)增加辞州,且要使用回調(diào)函數(shù)
消費(fèi)端:
記錄偏移量怔锌,關(guān)閉自動(dòng)提交,手動(dòng)提交偏移量
Kafka端:
設(shè)置 acks = all
解決辦法就是我們?cè)O(shè)置 acks = all。acks 是 Kafka 生產(chǎn)者(Producer) 很重要的一個(gè)參數(shù)埃元。
acks 的默認(rèn)值即為1涝涤,代表我們的消息被leader副本接收之后就算被成功發(fā)送。當(dāng)我們配置 acks = all 代表則所有副本都要接收到該消息之后該消息才算真正成功被發(fā)送岛杀。
設(shè)置 replication.factor >= 3
為了保證 leader 副本能有 follower 副本能同步消息阔拳,我們一般會(huì)為 topic 設(shè)置 replication.factor >= 3。這樣就可以保證每個(gè) 分區(qū)(partition) 至少有 3 個(gè)副本类嗤。雖然造成了數(shù)據(jù)冗余糊肠,但是帶來了數(shù)據(jù)的安全性。
設(shè)置 min.insync.replicas > 1
5遗锣、Redis集群怎么搭建
三種模式
1货裹、主從模式
一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn),其他節(jié)點(diǎn)為從節(jié)點(diǎn)精偿,可以實(shí)現(xiàn)讀寫分離弧圆,單節(jié)點(diǎn)宕機(jī)也保證可用性,缺點(diǎn)是主階段宕機(jī)需要人為干預(yù)去選出新的主節(jié)點(diǎn)
2笔咽、哨兵模式
基于主從模式搔预,增加了哨兵進(jìn)程用于監(jiān)控主節(jié)點(diǎn)情況,當(dāng)多個(gè)哨兵認(rèn)定主節(jié)點(diǎn)掛掉了叶组,就自動(dòng)選舉出一個(gè)從節(jié)點(diǎn)作為新的主節(jié)點(diǎn)拯田。但和主從一樣多個(gè)主從間存儲(chǔ)的都是相同的數(shù)據(jù)
3、集群模式
去中心化甩十,采用多主多從船庇,每個(gè)分區(qū)存儲(chǔ)不同數(shù)據(jù),客戶端直連枣氧,只需要連接任意一個(gè)節(jié)點(diǎn)溢十,每個(gè)分區(qū)都有全量插槽數(shù)據(jù)垮刹,通過計(jì)算插槽可得知數(shù)據(jù)具體在哪個(gè)節(jié)點(diǎn)达吞,并連接對(duì)應(yīng)節(jié)點(diǎn)獲取數(shù)據(jù)
- 支付場(chǎng)景高并發(fā)怎么處理
沒查到太好的辦法,但原則上是數(shù)據(jù)庫分庫分表荒典,主從結(jié)構(gòu)酪劫,使用分布式ID,雪花算法寺董,異步處理覆糟,保證數(shù)據(jù)最終一致性
親手搭建redis,kafka遮咖,zookeeper環(huán)境
7.分布式鎖
1.zookeeper實(shí)現(xiàn)
(1)利用節(jié)點(diǎn)名稱創(chuàng)建唯一共享鎖滩字,加鎖時(shí)所有客戶端一起創(chuàng)建/test/Lock節(jié)點(diǎn),只有一個(gè)能成功并獲取鎖,解鎖時(shí)刪除/test/Lock節(jié)點(diǎn)麦箍,其余客戶端繼續(xù)競(jìng)爭(zhēng)漓藕,直到全部客戶端都獲取鎖
(2)利用臨時(shí)順序節(jié)點(diǎn)創(chuàng)建唯一共享鎖,所有客戶端都去/test下創(chuàng)建節(jié)點(diǎn)挟裂,如果創(chuàng)建的客戶端發(fā)現(xiàn)自己創(chuàng)建的是最小節(jié)點(diǎn)享钞,就獲取鎖,否則監(jiān)視比自己小的節(jié)點(diǎn)诀蓉,進(jìn)入等待栗竖,比如創(chuàng)建節(jié)點(diǎn),/lock/0000000001渠啤、/lock/0000000002狐肢、/lock/0000000003。則節(jié)點(diǎn)/lock/0000000001會(huì)先獲得鎖埃篓,因?yàn)閦k上的節(jié)點(diǎn)是有序的处坪,且都是最小的節(jié)點(diǎn)先獲得鎖。
臨時(shí)順序節(jié)點(diǎn)比持久順序節(jié)點(diǎn)的好處是:當(dāng)zookeeper宕機(jī)后架专,臨時(shí)順序節(jié)點(diǎn)會(huì)自動(dòng)刪除同窘,獲取鎖的客戶端會(huì)釋放鎖,不會(huì)一直造成鎖等待部脚,而持久節(jié)點(diǎn)會(huì)造成鎖等待想邦。
方案一會(huì)產(chǎn)生驚群效應(yīng),當(dāng)鎖釋放后所有客戶端都會(huì)被喚醒委刘,然后競(jìng)爭(zhēng)分布式鎖
方案二避免了驚群丧没,按順序喚醒
2.redis實(shí)現(xiàn)分布式鎖
setnx(set if not exist):當(dāng)不存在key時(shí),才為key設(shè)置value锡移。而set會(huì)直接覆蓋value
getset:根據(jù)key得到舊的值呕童,并設(shè)置新的值,用于獲取過期時(shí)間淆珊,如果已經(jīng)過期則設(shè)置新的過期時(shí)間并獲得鎖
expire:設(shè)置過期時(shí)間
del:刪除
實(shí)現(xiàn)方式:
(1)獲取鎖的時(shí)候夺饲,使用setnx加鎖,并使用expire設(shè)置過期時(shí)間施符,超過該時(shí)間自動(dòng)釋放鎖往声,鎖的value為一個(gè)隨機(jī)生成的UUID,通過此UUID來釋放鎖
(2)獲取鎖的時(shí)候還設(shè)置一個(gè)獲取的超時(shí)時(shí)間戳吝,若超時(shí)則放棄鎖
(3)釋放鎖時(shí)需判斷UUID浩销,若是該鎖則使用delete進(jìn)行刪除
3.數(shù)據(jù)庫實(shí)現(xiàn)分布鎖
實(shí)現(xiàn)方式:利用樂觀鎖和悲觀鎖
樂觀鎖:表中添加版本號(hào)的字段,更新前查版本號(hào)听哭,更新時(shí)檢查版本號(hào)慢洋,一致則更新塘雳,不一致則回退
悲觀鎖:select…for update,更新時(shí)鎖表普筹,需要關(guān)閉數(shù)據(jù)庫自動(dòng)提交
8.分布分表
分庫分表的原因:
磁盤IO瓶頸:熱點(diǎn)數(shù)據(jù)過多粉捻,數(shù)據(jù)庫緩存放不下,查詢產(chǎn)生大量IO斑芜,降低查詢速度(分庫肩刃,垂直分表)
網(wǎng)絡(luò)IO瓶頸:請(qǐng)求的數(shù)據(jù)太多,網(wǎng)絡(luò)帶寬不夠(分庫)
CPU瓶頸:SQL語句慢杏头,單表數(shù)據(jù)量大(水平分表盈包,sql優(yōu)化)
水平分庫:以字段為依據(jù),按照一定策略(hash醇王,range等)呢燥,將一個(gè)庫的數(shù)據(jù)拆分到多個(gè)庫中。每個(gè)庫的結(jié)構(gòu)都一樣寓娩,每個(gè)庫的數(shù)據(jù)都不同叛氨,所有庫的數(shù)據(jù)為全量數(shù)據(jù)
水平分表:以字段為依據(jù),按照一定策略(hash棘伴,range等)寞埠,將一個(gè)表的數(shù)據(jù)拆分到多個(gè)表中。每個(gè)表的結(jié)構(gòu)都一樣焊夸,每個(gè)表的數(shù)據(jù)都不同仁连,所有表的數(shù)據(jù)為全量數(shù)據(jù)
垂直分庫:以表為依據(jù),按照業(yè)務(wù)歸屬不同阱穗,將不同表拆分到不同庫中饭冬。每個(gè)庫的結(jié)構(gòu)都不同,數(shù)據(jù)也不一樣
垂直分表:以字段為依據(jù)揪阶,按照字段的活躍性昌抠,將表中字段拆分到不同表中。每個(gè)表的結(jié)構(gòu)都不一樣鲁僚,每個(gè)表的數(shù)據(jù)也不一樣
分庫分表步驟:根據(jù)容量評(píng)估分庫分表個(gè)數(shù)——選擇key——分表規(guī)則(hash或range)——執(zhí)行(一般雙寫)——擴(kuò)容問題
分庫分表工具:ShardingSphere
9.什么是Hash
輸入不定長(zhǎng)度的數(shù)據(jù)炊苫,得到固定長(zhǎng)度數(shù)據(jù)的一種算法,特點(diǎn)是不能從結(jié)果推導(dǎo)出運(yùn)算過程