某大佬的20+公司面試題總結(jié)和自己的補(bǔ)充

附上原文鏈接(在此基礎(chǔ)上自己做了補(bǔ)充和修改炊昆。)

ZooKeeper

1. CAP定理

C:一致性(讀操作總能讀到以前的寫操作)
A:可用性(在單臺機(jī)器出錯時(shí),仍然能正常工作威根,不用遷移到其他機(jī)器)
P:分區(qū)容錯性 (異常情況下仍然能滿足CA)
該理論指出一個分布式系統(tǒng)不可能同時(shí)滿足CAP凤巨,ZooKeeper保證了CP,A的話在Leader選舉時(shí)會丟失部分請求

2. ZAB協(xié)議

分為消息廣播(半數(shù)follower收到請求即commit)和崩潰恢復(fù)(leader崩潰后選舉leader的過程)

3. Leader選舉算法和流程

每個ZooKeeper都有兩個Id洛搀,一個是代表自己的Pid敢茁,一個是代表本身所存儲的數(shù)據(jù)的Zid,
一開始還沒有l(wèi)eader也沒有數(shù)據(jù)的時(shí)候會選舉最大的Pid當(dāng)leader
當(dāng)運(yùn)行突然崩潰時(shí)留美,先每個都選舉自己彰檬,廣播自己的Pid和Zid,然后收到的機(jī)器廣播最大的那個Zid對應(yīng)的Pid谎砾,當(dāng)半數(shù)+1ZooKeeper同意的時(shí)候即成為Leader

Redis

1. Redis的應(yīng)用場景

緩存逢倍、簡單消息隊(duì)列、分布式鎖棺榔、共享session瓶堕。

2. Redis支持的數(shù)據(jù)類型(必考)

String(SDS字符串,簡單key-value症歇,并發(fā)計(jì)數(shù)郎笆,簡單緩存),
List(zipList忘晤,LinkedList宛蚓,雙向隊(duì)列,可以用作消息隊(duì)列设塔,可以先進(jìn)先出凄吏,也可以先進(jìn)后出),
Set(intSet闰蛔,HashTable痕钢,交并合集),
ZSet(ZipList序六,SkipList任连,熱搜榜一類,有排名的Set集合例诀,事實(shí)上還用Hashtable存了key-分值)随抠,
Hash(ZipList裁着,HashTable,rehash概念拱她、提高負(fù)載因子二驰,符合多重 key的情況,比如用戶的購物車秉沼?)

3. zset跳表的數(shù)據(jù)結(jié)構(gòu)(必考)

首先實(shí)現(xiàn)一個單項(xiàng)鏈表桶雀,然后在此之上比如說每隔一個節(jié)點(diǎn)指向往后數(shù)數(shù)第二個節(jié)點(diǎn)。這樣的跳層有很多層
查詢方式為氧猬,先跳背犯,如果大于了要查的分值,就往下一層查盅抚。
補(bǔ)充:跳表能用紅黑樹實(shí)現(xiàn)嗎,跳表的自平衡怎么實(shí)現(xiàn)倔矾?
紅黑樹沒法實(shí)現(xiàn)區(qū)間查詢妄均,跳表可以查到一個之后再前后查,時(shí)間復(fù)雜度為O(nlogn)
跳表是通過隨機(jī)函數(shù)來維護(hù)索引與原始鏈表大小之間的平衡

4. Redis的數(shù)據(jù)過期策略(必考)

比如1.每隔100ms哪自,查詢一部分?jǐn)?shù)據(jù)丰包,過期就刪除
2.查詢的key是過期的,刪除
當(dāng)內(nèi)存不夠使
對設(shè)置了過期時(shí)間的key:
隨機(jī)刪除壤巷、刪除快要過期的邑彪、刪除最不常用的、刪除一段時(shí)間最少使用的
對沒設(shè)置過期的key:
隨機(jī)刪除胧华、刪除最不常用的寄症,刪除最少使用的
或者直接報(bào)錯

5. Redis的LRU過期策略的具體實(shí)現(xiàn)

維護(hù)了一個大小固定的pool,每次隨機(jī)取值矩动,將lru值最小的放到pool里來

6. 如何解決Redis緩存雪崩有巧,緩存穿透問題

雪崩(隨機(jī)過期時(shí)間、永不過期)悲没、
穿透(表示惡意請求篮迎,在系統(tǒng)端判斷是否符合規(guī)則,比如id<0示姿,布隆過濾器)甜橱、
擊穿(查詢加for update,永不過期)

7. Redis的持久化機(jī)制(必考)

RDB(內(nèi)存快照),比較快栈戳,存儲的是內(nèi)容岂傲,可以BGSave,fork一個子進(jìn)程存儲荧琼,對于Slave可以一開始用這個同步譬胎,之后再以aof的形式同步差牛,開啟時(shí)會影響并發(fā)性能。進(jìn)行BGSave時(shí)服務(wù)可能會暫停幾秒(需要注意)
AOF(AppendOnlyFile)堰乔,比如每隔一秒將操作追加到log中偏化,開啟aof會導(dǎo)致吞吐量降低,但是比RDB可以更完整的保護(hù)數(shù)據(jù)镐侯,可以將AOF文件轉(zhuǎn)成RDB侦讨,

8. Redis的管道pipeline

減少TCP連接次數(shù),由客戶端緩存一部分命令后一次性發(fā)送苟翻。

9.Redis和memcached的區(qū)別

redis支持多種數(shù)據(jù)結(jié)構(gòu)韵卤,支持系列化,key-value可存儲上限為1G,單核
memcached只支持String崇猫,不支持序列化沈条,value大小最大為1MB,支持多核

10.Redis并發(fā)競爭key的解決方案

比如要set一個key诅炉,順序?yàn)?34 蜡歹,沒加鎖變成了432
zookeeper的分布式鎖實(shí)現(xiàn)(監(jiān)聽前面一個節(jié)點(diǎn),當(dāng)自己為第一個節(jié)點(diǎn)時(shí)涕烧,獲得鎖)
1.redis的分布式鎖實(shí)現(xiàn)(setnx+看門狗(比如當(dāng)key過期快到的時(shí)候還沒有delete月而,自動續(xù)時(shí)),或者直接redission)
2.消息隊(duì)列串行執(zhí)行

11.Redis與Mysql雙寫一致性方案

先更新mysql再刪除reids议纯,或者直接串行執(zhí)行

Mysql

1. 事務(wù)的基本要素

原子性父款,隔離性,一致性瞻凤,持久性

2. 事務(wù)隔離級別(必考)

Uncommited 臟讀
commitedread 不可重復(fù)度
repeatedtable 幻讀(mysql默認(rèn))
seriazable

3. 如何解決事務(wù)的并發(fā)問題(臟讀憨攒,幻讀)(必考)

直接上隔離級別就可解決
讀加共享鎖,寫加排它鎖

4. MVCC多版本并發(fā)控制(必考)

Inodb多 維護(hù)了兩個字段鲫构,一個是createversion浓恶,一個是deleteversion
update時(shí)會更新createversion
讀取到一行需要滿足該事務(wù)的version大于等于createversion,而小于deleteversion

5. binlog,redolog,undolog都是什么结笨,起什么作用

binlog記錄的是sql語句包晰,
redolog記錄是為了保證事務(wù)安全,當(dāng)數(shù)據(jù)庫掛掉之后重啟仍能通過redolog執(zhí)行未完成事務(wù)
undolog記錄的是上一個版本炕吸,用來回滾和快照讀伐憾,

6. InnoDB的行鎖/表鎖

不走索引會表鎖,走索引會行鎖赫模,for update树肃、update,insert都是行鎖
如果索引不為主鍵索引瀑罗,且索引可重復(fù)胸嘴,會有間隙鎖

7. myisam和innodb的區(qū)別雏掠,什么時(shí)候選擇myisam

innodb提供事務(wù),可以崩潰恢復(fù)劣像,最低行鎖
myisam不支持事務(wù)乡话,不能崩潰恢復(fù),表鎖耳奕,
讀寫分離绑青,讀庫可以選擇myisam

8. 為什么選擇B+樹作為索引結(jié)構(gòu)(必考)

B樹非葉子節(jié)點(diǎn)也會存,導(dǎo)致b樹高度變高屋群,io次數(shù)變多闸婴,而且葉子節(jié)點(diǎn)沒有指向下一個葉子節(jié)點(diǎn)的指針

9. 索引B+樹的葉子節(jié)點(diǎn)都可以存哪些東西(必考)

索引值,下一個葉子節(jié)點(diǎn)的開頭(范圍查詢的實(shí)現(xiàn))
主鍵索引可以不用再次查詢芍躏,因?yàn)橹麈I索引與數(shù)據(jù)放在一起邪乍。
普通索引需要再次查詢主鍵索引之后再得到數(shù)據(jù)

10. 查詢在什么時(shí)候不走(預(yù)期中的)索引(必考)

查詢字段中雖然為索引,但是索引大量重復(fù)
用了or纸肉,但是后面的字段沒有用到索引

11. sql如何優(yōu)化

創(chuàng)建索引溺欧,索引字段設(shè)置成notnull ,注意不走索引的情況:%打頭的like語句柏肪,!=用> union <實(shí)現(xiàn),is
null的查詢芥牌,注意最左匹配原則烦味;再有就是去優(yōu)化limit,先查id再limit壁拉,查詢別用select*谬俄,防止表修改后報(bào)錯或者查詢?nèi)哂?br> SQL的執(zhí)行順序:from---where--group by---having---select---order by

12. explain是如何解析sql的

explain ***之后會顯示sql走的類型,掃描的行數(shù)等等弃理,可以根據(jù)這個判斷sql

13. order by原理

利用索引的有序性獲取有序數(shù)據(jù)溃论,比較快(索引排序)
通過相應(yīng)的排序算法,將取得的數(shù)據(jù)在內(nèi)存中進(jìn)行排序,比較慢(文件排序)

14.Mysql為什么不用紅黑樹痘昌?

紅黑樹每個節(jié)點(diǎn)下只有兩個子節(jié)點(diǎn)钥勋,而硬盤IO時(shí)是按簇讀取的,兩個節(jié)點(diǎn)中的值可能不夠填滿簇導(dǎo)致每次IO的浪費(fèi)辆苔,此時(shí)紅黑樹的高度會大于B+樹算灸,導(dǎo)致IO次數(shù)增加。

JVM

1. 運(yùn)行時(shí)數(shù)據(jù)區(qū)域(內(nèi)存模型)(必考)

堆驻啤、方法區(qū)菲驴、虛擬機(jī)棧,本地方法棧骑冗、程序計(jì)數(shù)器

2. 垃圾回收機(jī)制(必考)

強(qiáng)引用:會爆出OOM也不會被回收
軟引用:在內(nèi)存不夠的時(shí)候被回收
弱引用:每次GC都會被回收(ThreadLocal中內(nèi)部類Map的key就是)
虛引用:可以用來跟蹤GC赊瞬,對象準(zhǔn)備被回收時(shí)發(fā)現(xiàn)他還有虛引用先煎,會把這個虛引用加入一個引用隊(duì)列,可以觀察這個隊(duì)列中虛引用是否存在來判斷對象是否被回收了巧涧。

3. 垃圾回收算法(必考)

引用計(jì)數(shù)(redis就是用的這個)
GCRoots(GCRoots可以簡單記憶為薯蝎,如果被刪就一定會影響程序運(yùn)行的對象,比如有虛擬機(jī)棧/本地方法棧中的引用對象褒侧,synchronized持有的對象良风,方法區(qū)中的靜態(tài)對象、常量)
分代收集
標(biāo)記清除(內(nèi)存泄漏)
標(biāo)記整理
復(fù)制(一般不用在老年代闷供,太耗時(shí)烟央,且浪費(fèi)空間)
補(bǔ)充:OOPMap和RememberSet
OOP是棧中所存儲的是引用的堆中的對象,可以快速枚舉GCRoots
RememberSet是為了加快新生代的GCRoots歪脏,他保存的是老年代中對象引用的新生代對象疑俭,
此時(shí)真正的新生代的GCRoots為 “新生代GCroot+rememberSet里的對象”
G1收集器將堆分為各個region,但是難免會有各個region互相引用的情況婿失,所以G1也用到了RememberSet

4. Minor GC和Full GC觸發(fā)條件

MinorGC:Eden區(qū)滿
fullgc:大對象直接 到老年代钞艇,老年代空間不足,system.gc豪硅,minorgc后發(fā)現(xiàn)老年代大剩余空間大小小于平均每次從新生代進(jìn)入老年代的值

5. GC中Stop the world(STW)

CMS會在找GCroot時(shí)和第二次查找時(shí)STW 哩照,查找完畢就結(jié)束STW開始清理垃圾
G1會在找GCRoot時(shí)和第二次查找時(shí)STW,需要等垃圾清理完才結(jié)束

6. 各垃圾回收器的特點(diǎn)及區(qū)別

serial:單線程懒浮,復(fù)制算法飘弧,與其他的交互少的交互和上下文切換,快砚著。
parnew:serial的多線程版本次伶,只有這個能配合CMS
scanvage:吞吐量優(yōu)先(用戶代碼執(zhí)行時(shí)間/用戶代碼+垃圾回收執(zhí)行的時(shí)間)
cms:老年代并發(fā)收集器,標(biāo)記清除算法稽穆,停頓時(shí)間段冠王,無法清理浮動垃圾,cpu敏感舌镶,線程數(shù)為(cpu數(shù)+3)/4柱彻,cpu少的用戶效率較低
G1 :強(qiáng)化分區(qū),弱化分代的概念乎折,本質(zhì)上是復(fù)制算法绒疗,能預(yù)測時(shí)間停頓

7. 雙親委派模型

類先由父加載器加載,如果不能加載再由子類加載骂澄。
通過類本身與加載器來確定類的唯一性吓蘑,防止 類被重復(fù)加載或者被修改核心的api

8. JDBC和雙親委派模型關(guān)系

簡單來說就是JDK的庫里有數(shù)據(jù)庫連接的接口,而具體實(shí)現(xiàn)是在各個數(shù)據(jù)庫的jar包中,又因?yàn)樽罡呒壍哪莻€加載器默認(rèn)只加載最基礎(chǔ)的jar包磨镶,所以只能用其他加載器去加載數(shù)據(jù)庫的jar包溃蔫,此時(shí)雙親委派模型已經(jīng)被破壞(可能說的比較亂,這塊我也不太理解琳猫,tomcat比較好懂一點(diǎn))
補(bǔ)充:tomcat與雙親委派模型
tomcat中能加載多個項(xiàng)目伟叛,為了防止多個項(xiàng)目不同jar包沖突,就不可能讓父加載器都去加載這些脐嫂,只能用子加載器加載各個項(xiàng)目的jar包统刮。而父級加載器加載tomcat本身所需的jar包來確保安全。
tomcat還實(shí)現(xiàn)了jsp的熱部署账千,這個也是通過類加載器實(shí)現(xiàn)的
我們都知道jsp本質(zhì)上是servlet侥蒙,他被類加載器加載后,如果被修改了匀奏,此時(shí)類名還是一樣鞭衩,類加載器還是會從方法區(qū)直接讀取已經(jīng)存在的“緩存”來加載,這樣我們就無法實(shí)現(xiàn)熱部署了娃善。那么怎么讓這個“緩存“失效呢论衍?就是用自己的一個jsp類加載器,每個加載完成之后就卸載掉聚磺,每次加載都會去讀取最新的坯台。如果此時(shí)使用雙親委派的話,需要把父類加載器卸載瘫寝,tomcat直接掛啦捂人。

9. JVM鎖優(yōu)化和鎖膨脹過程

鎖消除 不會發(fā)生競爭的情況下JVM會把鎖消除
鎖粗化 比如簡單for循環(huán)內(nèi)的synchronized會放到for循環(huán)外
偏向鎖 對象頭MarkWord01,還保存有持有的線程ID矢沿,這個MarKWord與無鎖狀態(tài)是一樣的,每次線程進(jìn)來只要比較每次進(jìn)來用CAS的方式把線程id設(shè)置成自己的酸纲,然后直接運(yùn)行即可捣鲸。

輕量級鎖 對象頭MarkWord00,由偏向鎖膨脹而來闽坡,先通過cas設(shè)置線程id栽惶,設(shè)置失敗,說明已經(jīng)有其他線程拿到偏向鎖了疾嗅,開始膨脹外厂,剛才那個拿到那個偏向鎖的線程會在自己棧幀中創(chuàng)建一塊區(qū)域保存對象的MarkWord信息,然后用CAS指向?qū)ο蟮腗arkWord區(qū)域代承。設(shè)置成功就相當(dāng)于獲得了輕量級鎖

重量級鎖 在輕量級鎖CAS多次失敗后會膨脹成重量級鎖汁蝶,此時(shí)其他線程過來的時(shí)候會直接掛起。喚醒需要由內(nèi)核態(tài)轉(zhuǎn)換到用戶態(tài),比較耗時(shí)掖棉。
自旋鎖墓律,就是一直嘗試獲取鎖,建立在別的線程獲取鎖占用時(shí)間比較短的認(rèn)知上幔亥。

Java基礎(chǔ)

1. HashMap和ConcurrentHashMap區(qū)別(必考)

線程不安全/安全
允許key-value為null/不允許

2. ConcurrentHashMap的數(shù)據(jù)結(jié)構(gòu)(必考)

1.7 segement+hashtable耻讽,put時(shí)lock自帶的自旋,一定次數(shù)后阻塞帕棉。獲得size的方法比較有意思针肥,先遍歷各個segement獲取下面的長度和修改次數(shù),加起來后再獲取一次香伴,相同就返回慰枕,不相同就常識多次,一定次數(shù)后加鎖
1.8 node數(shù)組+hashtable+紅黑樹瞒窒,put時(shí)cas自旋捺僻,多次后synchronized,多線程會幫助擴(kuò)容
兩者的get都是不用加鎖的崇裁,都用volatile修飾了

3. 高并發(fā)HashMap的環(huán)是如何產(chǎn)生的

1.7以前頭插法,在高并發(fā)的時(shí)候發(fā)生數(shù)組擴(kuò)容

4. volatile作用(必考)

保證可見性(這里指主內(nèi)存與工作內(nèi)存間的可見性)匕坯,防止指令重排(指令重排也會導(dǎo)致可見性問題)

5. Atomic類如何保證原子性(CAS操作)(必考)

unsafe類的CAS和volatile,注意ABA問題

6. synchronized和Lock的區(qū)別(必考)

Lock底層就是AQS拔稳,是CLH隊(duì)列的增強(qiáng)葛峻,CLH是一個先進(jìn)先出隊(duì)列,lock中把每個線程映射成CLH隊(duì)列的節(jié)點(diǎn)巴比,CLH本身是自旋的术奖,AQS在此基礎(chǔ)上增加了可中斷,可重入轻绞,阻塞等待而不是一直自旋采记,和非公平鎖,還包括資源的獨(dú)占和共享兩個功能
怎么實(shí)現(xiàn)非共平鎖政勃,有什么好處唧龄?
非公平鎖簡單來說就是當(dāng)線程即將進(jìn)入隊(duì)列時(shí),先cas爭取資源奸远,若得到則運(yùn)行既棺,一定次數(shù)后仍然失敗則加入隊(duì)列,此時(shí)已失去非公平的手段懒叛,只能等前面節(jié)點(diǎn)來喚醒他丸冕。
公平鎖可能會導(dǎo)致,前一個節(jié)點(diǎn)釋放后薛窥,喚醒下一個節(jié)點(diǎn)胖烛,此時(shí)線程還在由內(nèi)核向用戶態(tài)轉(zhuǎn)變,需要較多的時(shí)間,而非公平鎖可以減少這種情況的發(fā)生洪己。

7. 為什么要使用線程池(必考)

減少開銷妥凳,方便管理

8. 核心線程池ThreadPoolExecutor的參數(shù)(必考)

核心線程、最大線程答捕、消息隊(duì)列逝钥、存活時(shí)間、拒絕策略

9. ThreadPoolExecutor的工作流程(必考)

來一個先到核心線程拱镐,核心線程滿了到消息隊(duì)列艘款,消息隊(duì)列滿了最大線程還沒滿,就建非核心線程工作

10. 如何控制線程池線程的優(yōu)先級
image.png
11. 線程之間如何通信

鎖沃琅、信號

12. Boolean占幾個字節(jié)

百度到的 1或4

13. jdk1.8/jdk1.7都分別新增了哪些特性

1.8:lanmbd表達(dá)式哗咆,default關(guān)鍵字,紅黑樹益眉,尾插法晌柬,concurrenthashmap的node數(shù)組
1.7:不太了解,只知道1.7將String常量池(我更喜歡把它叫做String的對象池)放到堆中

14. Exception和Error

Exception可以catch后處理郭脂,比如IOexception年碘,出錯后程序仍能運(yùn)行
error是非檢查性異常,比如OOM,

補(bǔ)充:
簡單說說怎么讓三個線程循環(huán)打印

1.new 三個 semaphere 展鸡,一個為1屿衅,其他為0.當(dāng)A線程執(zhí)行時(shí)對自己的semaphere執(zhí)行acquire方法,執(zhí)行完畢后對下一個線程的semaphere執(zhí)行release莹弊。
不多比比涤久,上鏈接
如果讓你用三個線程循環(huán)打印ABC,你有幾種寫法忍弛?

Spring

1. Spring的IOC/AOP的實(shí)現(xiàn)(必考)

ioc:beanfactory响迂,在用到的時(shí)候加載到concurrenthashmap中,如果對象需要其他依賴细疚,會遞歸實(shí)現(xiàn)里面的依賴栓拜。applicationcontext就是在容器加載的時(shí)候就把全部的bean放到concurrenthashmap中啦
aop:切面編程,一般是將可復(fù)用的方法在切點(diǎn)前后執(zhí)行惠昔,實(shí)現(xiàn)方式有aspectj(靜態(tài)織入),cglib和jdk動態(tài)代理
順帶一提挑势,dubbo中用了裝飾器把invoker包裝成wrapper

2. 動態(tài)代理的實(shí)現(xiàn)方式(必考)

cglib:利用asm框架镇防,把代理對象的class文件加載進(jìn)來之后修改其字節(jié)碼生成子類。
JDK:利用反射機(jī)制生成一個實(shí)現(xiàn)代理接口的匿名類


image.png

image.png
補(bǔ)充:2.9bean的創(chuàng)建流程

1.獲取bean的名字
2.從緩存中查詢是否有這個bean
3.沒有的話就需要通過反射創(chuàng)建bean的實(shí)例(注意此時(shí)bean為空潮饱,里面東西都沒注入)
4.標(biāo)記這個bean已經(jīng)被創(chuàng)建了(此時(shí)可能會有循環(huán)依賴的問題来氧,Spring用三級緩存來解決,提前將bean曝光)
5.遞歸獲取依賴的其他的bean
6.給當(dāng)前bean綁定屬性

3. Spring如何解決循環(huán)依賴(三級緩存)(必考)

構(gòu)造器(初始化與賦值沒法分開)與prototype(沒有實(shí)現(xiàn)三級緩存)會報(bào)錯
三級緩存分別為1.初始化完成的bean(singletonObjects)2.實(shí)例化的bean(尚未綁定屬性,earlySingletonObjects)3.beanfactory(singletonFactories)
比如有兩個beanA和B循環(huán)依賴
在A的實(shí)例化階段標(biāo)記啦扬,將自己曝光到第三級緩存中中狂,發(fā)現(xiàn)自己依賴B,去初始化B扑毡,B初始化過程中發(fā)現(xiàn)自己依賴A胃榕,從第三級緩存中g(shù)etObject拿到A(注意此時(shí)A只是實(shí)例化完成,并沒有初始化)瞄摊,此時(shí)B順利進(jìn)行初始化勋又,將自己放到一級緩存中,此時(shí)返回A中换帜,A順利拿到B楔壤,完成了初始化階段,放到了一級緩存惯驼。

4. Spring的后置處理器

image.png
5. Spring的@Transactional如何實(shí)現(xiàn)的(必考)

也是通過AOP實(shí)現(xiàn)的蹲嚣,順帶一提,如果方法B由@Transactional修飾祟牲,而A方法沒有此注解隙畜,此時(shí)A去調(diào)用方法B,@Transactional失效

6. Spring的事務(wù)傳播級別
image.png
7. BeanFactory和ApplicationContext的聯(lián)系和區(qū)別

beanfactory:懶加載疲眷,
applicationcontext:繼承了beanfactory接口禾蚕,比beanfactory功能更多,加載時(shí)全部加載

其他

1. 高并發(fā)系統(tǒng)的限流如何實(shí)現(xiàn)
2. 高并發(fā)秒殺系統(tǒng)的設(shè)計(jì)
3. 負(fù)載均衡如何設(shè)計(jì)

某37互娛一面節(jié)選(Lucene篇)

1.Lucene為什么比數(shù)據(jù)庫快狂丝?

mysql的索引只是存儲field的內(nèi)容(如果過長换淆,只是存前多少位的內(nèi)容為索引)并沒用分詞
es存儲的是分詞以后的索引,每個詞都在哪些文檔中出現(xiàn)過几颜。
如果是搜索 keyword這種基本沒啥影響
但是如果是mysql的like "%word%" mysql全表查倍试,es只需要查"word"這個詞包含的文檔id 速度明顯不是一個級別。

2.什么是倒排索引蛋哭?

簡單理解就是將文章分詞后县习,用分出來的詞連接一個表,這個表里面是出現(xiàn)過這個詞的文章列表谆趾,可以根據(jù)這種方法快速查詢一個詞之后定位到文章躁愿,而不用去每個文章查這個詞。

3.倒排索引有哪幾部分沪蓬?分詞屬于那一部分(不確定)

暫時(shí)理解為三部分彤钟,單詞id,單詞跷叉,倒排列表


image.png

其他補(bǔ)充:

網(wǎng)絡(luò):

TCP和UDP的區(qū)別?

TCP保證數(shù)據(jù)安全逸雹,以流的形式傳輸营搅,一對一雙全工查排,能保證數(shù)據(jù)順序
UDP不保證數(shù)據(jù)安全贺待,以數(shù)據(jù)報(bào)的形式傳輸,一對多叼风,不保證數(shù)據(jù)順序

TCP是怎么保證安全的帖世?

校驗(yàn)和
應(yīng)答機(jī)制
超時(shí)重傳
擁塞控制
流量控制

https和http的區(qū)別休蟹?

https:443端口,在TCP/IP協(xié)議上封裝了一層TCL/SSL狮暑,以數(shù)字證書的形式來保證數(shù)據(jù)安全
(將用戶數(shù)據(jù)hash后由公鑰加密成密文鸡挠,拿到報(bào)文后解密密文,并在次將數(shù)據(jù)hash搬男,比較數(shù)據(jù)是否相同拣展,第一次傳輸用RSA得到對稱加密的秘鑰,之后都用對稱加密)
http:80端口缔逛,明文傳輸备埃,無狀態(tài)

get/post區(qū)別?

本質(zhì)上是無區(qū)別的褐奴,
在瀏覽器端按脚,get一般由url調(diào)用,順帶一提url的限制也是瀏覽器的原因敦冬,事實(shí)上http標(biāo)準(zhǔn)協(xié)議對url的長度沒有限制辅搬,而post一般由表單調(diào)用
在restful規(guī)范中,get被認(rèn)為是冪等的脖旱,用來請求數(shù)據(jù)堪遂,而post不冪等,用來實(shí)現(xiàn)資源的創(chuàng)建

Http請求的完整過程

1.DNS解析萌庆,先從瀏覽器緩存溶褪、內(nèi)存緩存、host文件践险、DNS服務(wù)器一步步把url解析成ip地址
2.拿到ip地址之后如果是自己網(wǎng)段的猿妈,一般路由器里都有對應(yīng)的mac地址,可以直接獲得然后三次握手建立TCP連接巍虫,如果不是自己網(wǎng)段的彭则,還需要發(fā)到網(wǎng)關(guān),由arp協(xié)議得到mac地址占遥。因?yàn)槠邔幽P投际巧蠈右蕾囅聦臃“阆雮鬏斂隙ǖ冒丫W(wǎng)絡(luò)和數(shù)據(jù)鏈路層搞定。
3.建立起TCP連接后就可以發(fā)送HTTP請求了筷频,這個請求到了服務(wù)端可能會有負(fù)載均衡蚌成、重定向,
4.處理完請求后把請求返回凛捏,由瀏覽器解析數(shù)據(jù)時(shí)發(fā)現(xiàn)還有一些靜態(tài)資源比如CSS JS或圖片担忧,又會發(fā)起另外的請求,這就是后話了坯癣。
5.處理完成后B/S架構(gòu)不像C/S瓶盛,一般都是短連接,四次揮手就關(guān)閉了示罗。

為什么連接的時(shí)候是三次握手惩猫,關(guān)閉的時(shí)候卻是四次握手

四次握手是因?yàn)閷Ρ扰c握手的被動接收方,他還需要一次握手傳輸未傳輸完的信息來保證信息的完整性蚜点。

cookie和session的區(qū)別

cookie保存在瀏覽器端轧房,一般有4BK的大小限制,cookie會有cros的安全問題绍绘,簡單來說就是別的惡心請求拿到了cookie之后每次請求都帶上奶镶,解決方法是用token或者直接禁用cookie,使用token可以讓特定的請求帶上而不是每次請求都帶上陪拘。
session保存在服務(wù)器端厂镇,需要用url或者cookie請求sessionid拿到,

xss攻擊和ddos左刽?

xss其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入惡意的 HTML 代碼捺信,當(dāng)用戶瀏覽該網(wǎng)站時(shí),這段 HTML 代碼會自動執(zhí)行
ddos 簡單來說就是大量請求去攻擊一個公用接口欠痴,使服務(wù)器負(fù)載上升
什么是 DDoS 攻擊迄靠?

你知道的協(xié)議有哪些,在哪個層斋否,有什么用梨水?

簡單挑幾個記吧。茵臭。 TCP IP ARP RAPR PPPOE SSL HTTP FTP SMTP


image.png
常見狀態(tài)碼及原因短語

1XX請求成功疫诽,正在處理
2XX請求成功,已經(jīng)處理
3XX 重定向
301永久重定向
302臨時(shí)重定向
4XX
400 請求語法錯誤
403 服務(wù)被拒絕
404頁面不存在
5XX
500服務(wù)器內(nèi)部錯誤(報(bào)錯了)
502 服務(wù)不可用

計(jì)算機(jī)系統(tǒng)

進(jìn)程和線程的區(qū)別

進(jìn)程是資源分配的最小單位旦委,進(jìn)程間不共享資源奇徒,通信困難
線程是cpu執(zhí)行的最小單位,線程共享本進(jìn)程的資源如內(nèi)存缨硝、I/O摩钙、cpu。同一時(shí)間內(nèi)同一個cpu只能執(zhí)行一個線程查辩。

進(jìn)程的調(diào)度算法

時(shí)間片胖笛、先來先服務(wù)网持、最短時(shí)間、優(yōu)先級

什么是虛擬內(nèi)存

虛擬內(nèi)存是為了解決如今在有限的內(nèi)存空間加載較大的應(yīng)用程序长踊,根據(jù)需要在磁盤和主存之間來回傳送數(shù)據(jù)功舀,通過段頁表的形式,先在虛擬內(nèi)存中取一段連續(xù)的內(nèi)存空間身弊,再將這段內(nèi)存空間映射到主內(nèi)存中辟汰,此時(shí)主內(nèi)存空間的程序段可以不連續(xù),我們可以用頁表的形式找到他阱佛。

進(jìn)程間的通信方式

匿名管道(fork帖汞,只能父子進(jìn)程通信)
有名管道(在內(nèi)核申請一塊區(qū)域,任何進(jìn)程都可同信)
信號(信號是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制凑术,內(nèi)核進(jìn)程可以利用他通知用戶空間進(jìn)程發(fā)生了哪些系統(tǒng)事件)
信號量(本質(zhì)是個計(jì)數(shù)器翩蘸,用來同步)
socket(首先創(chuàng)建套接字,然后綁定一個端口再監(jiān)聽套接字麦萤,可以通過網(wǎng)絡(luò)連接不同計(jì)算機(jī)上的進(jìn)程進(jìn)行通信)
共享內(nèi)存區(qū)(快鹿鳖,需要考慮并發(fā)情況)

死鎖怎么形成的,怎么解決死鎖

請求保持壮莹,互斥翅帜,循環(huán)等待,不可剝奪
解決方案:設(shè)置優(yōu)先級命满、請求一段時(shí)間后阻塞涝滴,
死鎖預(yù)防(用戶需要一次性請求全部資源),檢測到死鎖后強(qiáng)行剝奪進(jìn)程資源

Dubbo

什么是spi胶台?dubbo對其做了什么改動歼疮?

spi全名叫server provider interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制诈唬,可以在運(yùn)行時(shí)韩脏,通過全限定路徑名,動態(tài)的加載接口的實(shí)現(xiàn)類铸磅。
dubbo在這個基礎(chǔ)上做了擴(kuò)展赡矢,比如說jdk的spi,他會不管你需不需要用到這些類阅仔,只要你啟動就加載進(jìn)來吹散,而我們一些方法就想用到他的時(shí)候再用反射來加載,就像spring的beanfactory一樣八酒。
此外空民,在如果一個類需要擴(kuò)展的話,dubbo用裝飾者模式來實(shí)現(xiàn)了對類的擴(kuò)展羞迷,相當(dāng)于aop的實(shí)現(xiàn)界轩。

服務(wù)暴露流程和引用流程?

首先dubbo有幾個角色画饥,provider,consumer浊猾,注冊中心和監(jiān)控中心
簡單來說就是provider將接口暴露荒澡,把服務(wù)注冊到注冊中心,由consumer訂閱注冊中心与殃,在啟動的時(shí)候在注冊中心找到發(fā)布的接入入口,注冊到consumer服務(wù)里面碍现,相當(dāng)于創(chuàng)建了一個代理對象把服務(wù)間的通信封裝成了一個對象的調(diào)用幅疼。底下涉及到了網(wǎng)絡(luò)通信、協(xié)議的轉(zhuǎn)換等昼接。
具體一點(diǎn):
服務(wù)暴露:一開時(shí)就是解析一些配置文件爽篷,然后有一個serviceBean來執(zhí)行暴露邏輯,里面主要涉及到protocal協(xié)議類慢睡,這個servicebean在初始化完成的時(shí)候會把那些參數(shù)注入進(jìn)來逐工,然后到ioc容器初始化完成的時(shí)候,開始來暴露方法漂辐,把要注冊的方法封裝成一個服務(wù)的執(zhí)行對象invoker泪喊,先把這個放到自己的緩存中,通過protocal協(xié)議類去把invoker通過協(xié)議暴露給外部髓涯。
服務(wù)引用:
引用與服務(wù)暴露類似袒啼,一開始也是初始化配置,然后有一個ReferenceBean來執(zhí)行引用邏輯纬纪,主要利用RegistryProtocol完成provider的訂閱蚓再、自己本身consumer的注冊、和執(zhí)行對象invoker的創(chuàng)建(這里訂閱完成后如果有變動會調(diào)用notify方法去注冊和修改緩存里的invoker)包各,把url和invoker的映射關(guān)系加到緩存之后還沒完摘仅,根據(jù)負(fù)載均衡算法拿到要執(zhí)行的invoker后,動態(tài)代理生成代理類问畅,通過代理類來完成請求遠(yuǎn)程dubbo服務(wù)并獲取響應(yīng)結(jié)果的功能娃属。

dubbo的負(fù)載均衡機(jī)制?

輪詢按声、加權(quán)輪詢膳犹、一致性哈希、隨機(jī)签则、最少活躍數(shù)

dubbo的容錯機(jī)制须床?

廣播 (一個報(bào)錯就失敗,用于更新各個provider的本地資源信息)
多次發(fā)送(有一個成功就行渐裂,高時(shí)效性的讀)
失敗后重試(冪等)
失敗后報(bào)錯(不冪等)
失敗后不報(bào)錯記錄日志(審計(jì)日志)
失敗后按照配置策略一段時(shí)間后重試(消息通知)
dubbo支持的協(xié)議豺旬?

灰度發(fā)布了解嗎钠惩?

version標(biāo)簽為*,按照負(fù)載均衡的機(jī)制來找機(jī)器調(diào)方法族阅,一部分機(jī)器更新為最新版

消息隊(duì)列

消息隊(duì)列的作用篓跛?

異步:比如訂單服務(wù)與下單后送的優(yōu)惠券服務(wù),兩者異步執(zhí)行坦刀。
削峰:大量寫操作愧沟,可以用消息隊(duì)列削峰。
解耦:仍然是訂單服務(wù)和優(yōu)惠券服務(wù)鲤遥,減少各個系統(tǒng)間的耦合沐寺,本系統(tǒng)只保證本系統(tǒng)的實(shí)現(xiàn)和消息隊(duì)列的落地,別的系統(tǒng)的落地由消息隊(duì)列來保證盖奈。


image.png
kafka的角色組成混坞?
image.png

Producer:服務(wù)生產(chǎn)者
Consumer:服務(wù)消費(fèi)者(注意下文與partition的關(guān)系)
Broker:代理,可以看作是一個kafka的實(shí)例钢坦,由多個Broker可以組成一個集群Cluster究孕。一個Broker中還包含Topic(主題)和Partition(分區(qū))的概念
Topic:Producer 將消息發(fā)送到特定的主題,Consumer 通過訂閱特定的 Topic(主題) 來消費(fèi)消息爹凹。
Partition:分區(qū)屬于Topic的一部分厨诸,一個 Topic 可以有多個 Partion,在每個Broker中都有他的全部信息(高可用)逛万,而各個Consumer也可以去不同的partition去讀取泳猬。
重要:如果有三個partition,四個consumer宇植,其中一個consumer會空閑得封。

kafka怎么保證高可用?

簡單來說指郁,就是備份分區(qū)僅僅用作備份忙上,不做讀寫。如果某個Broker掛了闲坎,會選舉其他的partition來作為主分區(qū)疫粥。

如果重復(fù)消費(fèi)/消息消費(fèi)失敗怎么辦?怎么保證冪等腰懂?

此時(shí)就需要操作保證請求的冪等梗逮。 消息消費(fèi)失敗會有重試機(jī)制去保證他成功。
冪等的實(shí)現(xiàn)可以說多種多樣绣溜。
1.全局唯一id
比如用戶付費(fèi)成功(流水表里面有唯一id)慷彤,然后用消息隊(duì)列調(diào)用其他業(yè)務(wù)(其他業(yè)務(wù)中會有流水表唯一id字段),可以先去查這個id存不存在,不存在就執(zhí)行底哗。
2.表中狀態(tài)字段
比如訂單表中有一個是否已支付的字段岁诉,去查的時(shí)候可以通過這個字段來決定是否執(zhí)行。
3.唯一索引實(shí)現(xiàn)insert的冪等
比如已經(jīng)創(chuàng)建流水id跋选,可以把這個設(shè)置成唯一索引涕癣,其他再次insert時(shí)就會報(bào)錯。
再比如通過全局唯一id和用戶id設(shè)置成聯(lián)合唯一索引前标,可以實(shí)現(xiàn)秒殺場景下坠韩,一個用戶只能購買一件的需求。
3.redis實(shí)現(xiàn)冪等
比如發(fā)驗(yàn)證短信的場景炼列,先獲取一個token同眯,保存在redis中,操作加入到消息隊(duì)列唯鸭,然后判斷下redis中是否有這個token,有的話就消費(fèi)并且把reids中的token刪除硅确,沒有的話就不執(zhí)行目溉。

怎么保證消息的有序執(zhí)行?

1菱农、當(dāng)消息加入到一個partition的時(shí)候缭付,都是增量添加,所以都是有序的循未,所以可以設(shè)定只有一個partition陷猫。(不推薦這種方法,失去了kafka的高可用)
2的妖、指定partition發(fā)送绣檬,Kafka 中發(fā)送 1 條消息的時(shí)候,可以指定topic, partition, key,data(數(shù)據(jù)) 4 個參數(shù)嫂粟。如果你發(fā)送消息的時(shí)候指定了 partion 的話娇未,所有消息都會被發(fā)送到指定的 partion。并且星虹,同一個 key 的消息可以保證只發(fā)送到同一個 partition零抬,比如我們可以把唯一訂單號作為key,這樣一個訂單的操作就能保證順序消費(fèi)了宽涌。

消息如何保證不丟失平夜?

kafka在partition有數(shù)據(jù)進(jìn)來的時(shí)候會先緩存一部分,等數(shù)據(jù)量足夠多或者等待一定時(shí)間再批量寫到磁盤的消息日志上卸亮。

消息積壓怎么辦忽妒?

擴(kuò)展機(jī)器數(shù)量,創(chuàng)建新的topicB ,設(shè)定10個partition锰扶,之前A的消費(fèi)者邏輯改為獲取到topicA的消息之后献酗,發(fā)topicB的消息,然后新的10臺機(jī)器來處理topicB的數(shù)據(jù)坷牛,這樣效率是以前的3倍罕偎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市京闰,隨后出現(xiàn)的幾起案子颜及,更是在濱河造成了極大的恐慌,老刑警劉巖蹂楣,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏站,死亡現(xiàn)場離奇詭異,居然都是意外死亡肄扎,警方通過查閱死者的電腦和手機(jī)赁酝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酌呆,“玉大人衡载,你說我怎么就攤上這事隙袁。” “怎么了菩收?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵梨睁,是天一觀的道長娜饵。 經(jīng)常有香客問我,道長拴念,這世上最難降的妖魔是什么褐缠? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任队魏,我火速辦了婚禮万搔,結(jié)果婚禮上官帘,老公的妹妹穿的比我還像新娘刽虹。我一直安慰自己,他們只是感情好胖缤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布哪廓。 她就那樣靜靜地躺著初烘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪综膀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天抓歼,我揣著相機(jī)與錄音拢锹,去河邊找鬼。 笑死蹋半,一個胖子當(dāng)著我的面吹牛减江,可吹牛的內(nèi)容都是我干的捻爷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼降宅!你這毒婦竟也來了腰根?” 一聲冷哼從身側(cè)響起贸营,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刘莹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體福稳,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毁枯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了质涛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情址芯,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竹挡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一搅窿、第九天 我趴在偏房一處隱蔽的房頂上張望闹司。 院中可真熱鬧耐朴,春花似錦铐刘、人聲如沸画株。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共耍。三九已至,卻和暖如春着绊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背一铅。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工搜囱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坏晦。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像邮绿,于是被迫代替她去往敵國和親斯碌。 傳聞我的和親對象是個殘疾皇子肛度,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 包含的重點(diǎn)內(nèi)容:JAVA基礎(chǔ)JVM 知識開源框架知識操作系統(tǒng)多線程TCP 與 HTTP架構(gòu)設(shè)計(jì)與分布式算法數(shù)據(jù)庫知...
    消失er閱讀 4,333評論 1 10
  • 一 基礎(chǔ)篇 1.1 Java基礎(chǔ) 面向?qū)ο蟮奶卣鞒橄?將一類對象的共同特征總結(jié)出來構(gòu)建類的過程冠骄。繼承:對已有類的一...
    essential_note閱讀 698評論 0 0
  • 1蚀之,java堆,分新生代老年代寿谴,新生代有Eden失受,from surviver,to surviver三個空間痪署,堆被...
  • Elaine在媽媽肚子里時(shí)就確診先天性器官畸形狼犯,出生8個月做了大手術(shù)。 醫(yī)生提醒,學(xué)習(xí)方面呐馆,對她不要期望太高莲兢,同時(shí)...
    花梅金閱讀 366評論 0 7
  • 人一旦被生活所迫 哪顧及得了矜持改艇,只有斤斤計(jì)較的心態(tài) 占小便宜成了節(jié)儉的方式 這一切不是別人運(yùn)氣好,別人有錢 回溯...
    Dougigi閱讀 162評論 3 0