一示启、項目類
意義最大的項目
項目中遇到的最困難的問題
3湃密、項目中用到的設(shè)計模式
責(zé)任鏈模式巫员,工廠
4庶香、項目的結(jié)構(gòu)框圖(支付系統(tǒng)的流程)
二、Java源碼類
1简识、hashmap和concurrenthashmap的區(qū)別和優(yōu)缺點
hashmap線程不安全赶掖,chashmap線程安全
2、加解密算法七扰,RSA奢赂,jdk的一些加密api
3、
三颈走、多線程類
1膳灶、自增的原子性
2、volatile (long類型的原子性) http://www.cnblogs.com/dolphin0520/p/3920373.html
cpu存在各自的高速緩存立由,兩個線程同時操作自己cpu的高速緩存中的值轧钓,再寫入內(nèi)存,可能會出現(xiàn)和預(yù)期結(jié)果不一致的情況锐膜,這就是緩存一致性問題毕箍。解決緩存一致性問題,主要有兩種方式:
1道盏、在總線加LOCK#指令
2而柑、緩存一致性協(xié)議
起初通過總線加鎖實現(xiàn),但是在加鎖期間捞奕,其他CPU不能訪問內(nèi)存牺堰,效率有一絲低下。所以緩存一致性協(xié)議應(yīng)運而生颅围。核心思想是伟葫,當(dāng)CPU在操作一個共享變量的時候,發(fā)出信號通知其他CPU將自己緩存里的變量設(shè)置為無效狀態(tài)院促,等下次其他CPU再去操作這個變量的時候筏养,發(fā)現(xiàn)緩存中變量狀態(tài)是無效,就會去內(nèi)存里讀取常拓,這樣值就保證了一致
3渐溶、lock的實現(xiàn)
lock的鎖實現(xiàn)是基于一個內(nèi)部類Sync實現(xiàn)的,內(nèi)部類Sync的實現(xiàn)則是基于JUC包中的并發(fā)組件的基礎(chǔ)框架AQS弄抬,Sync有兩個子類茎辐,分別的公平和不公平,對應(yīng)了公平鎖和不公平鎖的兩種實現(xiàn)方式。默認(rèn)是不公平鎖拖陆,在不公平鎖的lock方法被調(diào)用時弛槐,線程會直接嘗試acs的方式設(shè)置state的值為1,也就是說直接獲取鎖而不排隊依啰,所以叫不公平鎖乎串。如果值設(shè)置成功,也就是說當(dāng)前線程已經(jīng)獲取了鎖了速警,那將當(dāng)前持有線程的變量值設(shè)置為當(dāng)前線程叹誉,ownerThread這個變量是AQS的父類定義的一個變量。如果acs沒有設(shè)值成功闷旧,則進入acquire方法嘗試獲取鎖长豁,首先調(diào)用的是tryAcquire方法,這個方法AQS是沒有給出實現(xiàn)的鸠匀,而是將實現(xiàn)留給了子類蕉斜,意味著子類可以根據(jù)公平或不公平逾柿,或者其它原則來實現(xiàn)這個獲取鎖的過程缀棍。非公平鎖的話首先還是ACS得方式將state值設(shè)置為1,如果成功則意味著成功獲取了鎖机错,那接下來的操作和之前一樣爬范,將持有鎖的線程設(shè)置為當(dāng)前線程,然后返回弱匪,如果沒有成功青瀑,則說明鎖被其它線程正持有,那就接著判斷持有鎖的線程和當(dāng)前獲取鎖的線程是不是同一個線程萧诫,如果是的話斥难,就將state+1,返回帘饶,這意思就是說ReetrantLock是可重入的哑诊,當(dāng)前線程可以重復(fù)持有多次鎖,只要使用完成后釋放相應(yīng)多的次數(shù)即可及刻。AQS的state在不同的子類里代表不同的意思镀裤,在ReetrantLock中就表示了當(dāng)前線程的鎖的次數(shù)。兩次嘗試都沒有成功的話缴饭,tryAcquire方法返回false暑劝,AQS調(diào)用acquireQueued方法,將當(dāng)前線程加入到等待隊列中颗搂,然后調(diào)用當(dāng)前請求鎖的線程的interrupt方法將線程阻塞担猛。
4、AQS的實現(xiàn)
AQS通過模板方法模式為子類的實現(xiàn)定下基調(diào)。AQS中規(guī)范了acquire和release的流程傅联,但是tryAcquire和tryRelease留給子類自己實現(xiàn)智嚷。AQS中維護了一個int類型的變量status,這個變量的使用很自由纺且,子類可以任意定義變量所表示的含義盏道,例如最常見的ReentrantLock中status就用來表示鎖被線程持有的次數(shù)。AQS中維護了一個隊列來放置等待獲取鎖的被阻塞的線程载碌,每個線程被構(gòu)造成一個Node對象猜嘱。
5、線程池的實現(xiàn)原理嫁艇,參數(shù)的用處 https://www.cnblogs.com/KingJack/p/9595621.html
execute方法:
workerCountOf(c) 獲取當(dāng)前線程池的線程數(shù)朗伶,如果小于指定容量,則addWorker
如果addWorker失敗步咪,或者當(dāng)前線程數(shù)b不小于線程池容量
如果線程池還在工作而且向工作隊列中添加任務(wù)成功论皆,則進行一次recheck檢查線程池當(dāng)前的線程數(shù)是否小于線程池的容量,如果線程池沒有在running猾漫,將任務(wù)從隊列中移除点晴,并且調(diào)用reject。如果線程池還在running悯周,但是當(dāng)前線程池數(shù)量為0粒督,則新建任務(wù)
如果線程池沒有在工作或者向工作隊列中添加任務(wù)線程不成功,那么嘗試直接創(chuàng)建新線程來執(zhí)行任務(wù)禽翼,如果失敗屠橄,reject方法調(diào)用
addWorker方法:
6、volatile能使得非原子操作變成原子的嗎
能闰挡。long和double
7锐墙、什么是線程局部變量
8、線程通信的方式
1长酗、最容易想到的溪北,共享變量,用synchronized花枫,volatile等修飾的變量刻盐,可以用作線程之間的通信
2、隊列劳翰,生產(chǎn)者消費者不同的線程之間用隊列來共享內(nèi)容
3敦锌、Condition
4、notify()
9佳簸、Happen Before
如果一個操作的結(jié)果需要對另一個操作可見乙墙,這兩個操作就是happens-before關(guān)系
包括:
書寫操作按照代碼的順序發(fā)生
unlock發(fā)生在下一個lock之前
讀操作發(fā)生在寫操作之前
線程的start發(fā)生在線程的其他動作之前
總的來說就是指令執(zhí)行按照代碼的順序執(zhí)行颖变,如果前后代碼存在關(guān)聯(lián)關(guān)系
這些原則都是原生Java就滿足的happens-before原則,是Java語言天生具備的有序性
10听想、AtomicInteger等原子類
11腥刹、ReentrantLock和synchronized的區(qū)別
1、Reen可以控制公平性汉买,syn是天生非公平的衔峰。
2、Reen提供中斷等待蛙粘,超時等操作垫卤,syn不可以。
12出牧、countdownlatch源碼 http://www.reibang.com/p/2effb6b3e6c6
13穴肘、避免重復(fù)創(chuàng)建線程
https://blog.csdn.net/MingHuang2017/article/details/79571529
14、多線程的同步和互斥有哪幾種方法
1舔痕、臨界區(qū):通過對多線程的串行化來訪問公共資源或一段代碼评抚,速度快,適合控制數(shù)據(jù)訪問伯复。
2慨代、互斥量:為協(xié)調(diào)共同對一個共享資源的單獨訪問而設(shè)計的。
3边翼、信號量:為控制一個具有有限數(shù)量用戶資源而設(shè)計鱼响。
4、事 件:用來通知線程有一些事件已發(fā)生组底,從而啟動后繼任務(wù)的開始。
15筐骇、批量執(zhí)行異步任務(wù)
四债鸡、JVM類
1、Java的垃圾回收機制
Java內(nèi)存分為新生代铛纬,老年代,再細(xì)分可以分為eden棺弊,兩個survivor區(qū)模她,新創(chuàng)建的對象被分配在eden區(qū),當(dāng)分配不下時畜侦,觸發(fā)新生代GC旋膳,將存活的對象復(fù)制到其中一個survivor區(qū)验懊,判斷對象是否應(yīng)該被回收常見的有兩種算法咏连,一種是引用計數(shù),一種是可達性分析鲁森,引用計數(shù)是為對象添加一個引用計數(shù)器祟滴,如果引用計數(shù)器是0則可以被回收,這種方法在某些情況下會導(dǎo)致內(nèi)存泄漏歌溉,比如說循環(huán)引用垄懂,可達性分析是指定一些對象作為GC Roots,可以作為gcroots的對象一般是本地變量表中的對象草慧,靜態(tài)類屬性,常量引用的對象等,從這些對象出發(fā)的調(diào)用鏈到達不了的對象蹂析,會被認(rèn)定為是需要回收的對象。值得注意的是电抚,虛擬機在分析對象的引用關(guān)系時惕稻,為了防止引用關(guān)系發(fā)生變化蝙叛,會暫停所有線程,就是常說的stoptheworld。當(dāng)對象被認(rèn)定為是需要回收的對象,則虛擬機會將其回收唇撬,回收算法有很多種扑浸,新生代使用以空間換時間的復(fù)制清除酝惧,除此之外還有標(biāo)記清除,標(biāo)記整理等,例如在老年代這種不需要額外空間來爭取效率的場景就會使用標(biāo)記清除或者標(biāo)記整理。
常見的收集器:
G1:全區(qū)域的垃圾收集届谈,
2枯夜、JVM是如何實現(xiàn)反射的
3、jvm調(diào)優(yōu)的參數(shù)
4艰山、雙親委派機制湖雹,哪些情況違反了,雙親委派的好處
回答:哪些情況違反:
1曙搬、jdk1.2之前就已經(jīng)實現(xiàn)的類加載器
2、基礎(chǔ)類需要回調(diào)用戶代碼的時候征讲,線程上下文類加載器诗箍,可以使父加載器去請求子類加載器癣籽,實現(xiàn)逆向的加載
3、OSGI模塊化熱部署滤祖,實現(xiàn)的類加載器是網(wǎng)狀結(jié)構(gòu)筷狼,而非雙親委派模型的樹狀結(jié)構(gòu),類加載器可以委派同級別的其它類加載器完成
雙親委派的好處:具備天生的優(yōu)先級關(guān)系匠童,使得同一個根類在不同的類加載環(huán)境中加載出來的都是一樣的對象埂材。例如Object類無論何時加載都得到一樣的對象。
5汤求、stop the world是咋回事
回答:虛擬機在GC之前需要判斷對象是否存活俏险,常見的有兩種算法,引用計數(shù)和可達性分析首昔。HotSpot的基于可達性分析算法實現(xiàn)的寡喝,可達性分析算法必須要求定義一系列的GCRoots節(jié)點,并且在進行分析工作時這些節(jié)點的引用關(guān)系不能動態(tài)變化勒奇,不然分析的準(zhǔn)確性得不到保證预鬓,因此在整個分析的過程中,所有的Java線程都將被停頓赊颠,sun將這件事稱為stop the world格二。
6、內(nèi)存泄漏和內(nèi)存溢出
7竣蹦、Java類文件結(jié)構(gòu)
Java虛擬機不與任何語言綁定顶猜,只能運行字節(jié)碼的class文件。變量痘括,關(guān)鍵字长窄,運算符等都是由不同的字節(jié)碼組合而成。
class文件是以8字節(jié)為基礎(chǔ)單位的一組二進制流纲菌。Class文件只有兩種數(shù)據(jù)類型:無符號數(shù)和表挠日。無符號數(shù)包括u1,u2,u4,u8四種,分別代表一個字節(jié)翰舌,2個嚣潜,4個,8個字節(jié)椅贱。表是由無符號數(shù)和其它表組合而成的復(fù)雜數(shù)據(jù)結(jié)構(gòu)懂算,所有的表都習(xí)慣性的以_info結(jié)尾只冻。整個Class文件實際上就是一張表。
每個Class文件的頭四個字節(jié)都是魔數(shù)计技,標(biāo)記Class文件的合法性喜德。接下來4-2-2個字節(jié)分別是文件版本號次版本號和主版本號。主版本號之后緊接著是常量池的入口酸役,常量池的常量數(shù)量不是固定的住诸,所以常量池入口需要放置一個u2類型的數(shù)據(jù)代表常量池的計數(shù)值,且計數(shù)是從1開始而不是從0開始的涣澡。常量池當(dāng)中存放字面量和符號引用
常量池結(jié)束之后贱呐,緊接著兩個字節(jié)代表訪問標(biāo)志--access_flags。這個標(biāo)志用于識別類信息入桂,例如class是類還是接口奄薇,是public還是private等等。access_flags一共有16位抗愁,但是目前只使用了8位馁蒂,b其余的位用0填充。
類索引和父類索引都是u2類型的數(shù)據(jù)蜘腌,但是接口索引是u2類型的數(shù)據(jù)集沫屡。Class文件依據(jù)這三種數(shù)據(jù)來判斷類的繼承關(guān)系。父類索引只有一個撮珠。Object類的父類索引位為0 沮脖。這三類索引數(shù)據(jù)按順序排在訪問標(biāo)志之后。
緊接著是字段表芯急。字段表包含了類級變量和實例變量勺届,但是不包含方法中的局部變量。
緊接著是方法表娶耍。數(shù)據(jù)含義與字段表類似免姿,但是由于volatile等關(guān)鍵字不能修飾方法,因此標(biāo)志位少了幾個榕酒。方法里的代碼胚膊,被編譯成字節(jié)碼存放在方法表中的一個code字段。
8想鹰、字節(jié)碼指令簡介:
1)加載和存儲指令
五澜掩、Spring
1、Spring bean的生命周期
- Spring容器 從XML 文件中讀取bean的定義杖挣,并實例化bean。
- Spring根據(jù)bean的定義填充所有的屬性刚陡。
- 如果bean實現(xiàn)了BeanNameAware 接口惩妇,Spring 傳遞bean 的ID 到 setBeanName方法株汉。
- 如果Bean 實現(xiàn)了 BeanFactoryAware 接口, Spring傳遞beanfactory 給setBeanFactory 方法歌殃。
- 如果有任何與bean相關(guān)聯(lián)的BeanPostProcessors乔妈,Spring會在postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們。
- 如果bean實現(xiàn)IntializingBean了氓皱,調(diào)用它的afterPropertySet方法路召,如果bean聲明了初始化方法,調(diào)用此初始化方法波材。
- 如果有BeanPostProcessors 和bean 關(guān)聯(lián)股淡,這些bean的postProcessAfterInitialization() 方法將被調(diào)用。
- 如果bean實現(xiàn)了 DisposableBean廷区,它將調(diào)用destroy()方法唯灵。
2、Spring的元注解
3隙轻、xml 中配置的 init埠帕、destroy 方法怎么可以做到調(diào)用具體的方法
4、applicationContext.xml是怎么被加載的
XmlBeanFactory 或ClassPathXmlApplicationContext加載xml文件
getInputStream獲取文件流
doLoadBeanDefinitions方法 讀取xml文件 SAX解析出Document對象
驗證xml文件的格式規(guī)范玖绿,加載命名空間敛瓷,下載dtd
BeanDefinitionDocumentReader .registerBeanDefinitions() 加載xml中定義的bean
registerBeanDefinitions方法中,又調(diào)用parseDefaultElement等方法來解析import標(biāo)簽斑匪,bean標(biāo)簽等等
5呐籽、spring aop的實現(xiàn)原理白热,動態(tài)代理
aop中的動態(tài)代理:
1梁只、JDK動態(tài)代理:代理對象與被代理對象實現(xiàn)同一接口
Proxy.newProxyInstance JDK反射包提供的工廠,Class對象在運行時以 參數(shù)形式傳入锄贷,也就是說代理關(guān)系是在運行時指定的苍姜,不是在編譯時指定的牢酵,因此是動態(tài)代理,和靜態(tài)的有區(qū)分衙猪,字節(jié)碼級別的代理對象
2馍乙、CGLIB:被代理類不需要強制實現(xiàn)接口,通過實現(xiàn)MethodInterceptor 垫释,重寫intercept方法丝格,dubboxieyidt tedian
所有的動態(tài)代理,都是在運行時生成被代理的子類棵譬。spring aop根據(jù)被代理的子類是否實現(xiàn)了接口显蝌,選擇使用哪一種代理方式,【問題:如何知道是否實現(xiàn)了接口呢】
6订咸、spring攔截器
7曼尊、spring事務(wù)
7大傳播特性
有事務(wù)酬诀,加入,沒有就新建
有事務(wù)骆撇,加入瞒御,沒有就非事務(wù)
有事務(wù),加入神郊,沒有拋出異常
有事務(wù)肴裙,嵌套(等于還是新建了一個)
有事務(wù),掛起當(dāng)前涌乳,新建一個
有事務(wù)蜻懦,掛起當(dāng)前,非事務(wù)執(zhí)行
有事務(wù)爷怀,拋出異常阻肩,沒有就非事務(wù)
5種隔離級別:
默認(rèn)和數(shù)據(jù)庫的一樣
未提交讀:沒提交就能讀
已提交讀:提交了才能讀
可重復(fù)讀:
串行化
8、springMVC dispatcherServlet源碼
六运授、MyBatis
1烤惊、mybatis接口和xml映射 https://blog.csdn.net/birthmarkqiqi/article/details/68939535
1、MapperRegistry 類注冊了所有mapper接口
2吁朦、MapperProxyFactory是mapper代理類工廠
3柒室、在factory中調(diào)用Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[] { mapperInterface },mapperProxy); 創(chuàng)建mapper的代理類。這是jdk的動態(tài)代理
mapperProxy就是扮演了InovationHandler的角色逗宜,在方法調(diào)用前后進行代理
mapperProxy有invoke方法雄右,通過將method作為參數(shù)傳入cachedMapperMethod方法,獲取到MapperMethod 纺讲,即執(zhí)行sql的封裝對象擂仍,然后再execute對應(yīng)的sql
sql語句是從哪里來?Method對應(yīng)了接口的方法熬甚,所以method對象在cachedMapperMethod方法里逢渔,創(chuàng)建了MapperMethod對象,而MapperMethod中有一個SqlCommand對象乡括,保存了sql的信息肃廓。至于信息的轉(zhuǎn)換,sql的填充等等诲泌,都是在SqlCommand的構(gòu)造方法里實現(xiàn)的盲赊,里邊有一個resolveMappedStatement方法,解析出MappedStatement對象敷扫。
MapperMethod 持有了一些sql的信息哀蘑,調(diào)用其execute方法,就可以執(zhí)行sql了。在execute內(nèi)部递礼,調(diào)用的是rowCountResult方法來執(zhí)行sql的惨险。
2、mybatis一對多查詢
七脊髓、Dubbo
1、dubbo實現(xiàn)原理 https://blog.csdn.net/u013076044/article/list/2?
是一個分布式框架栅受,分為服務(wù)消費者将硝,服務(wù)提供者,注冊中心等幾個角色屏镊。注冊中心會對服務(wù)的提供者進行實時的心跳檢測依疼,發(fā)現(xiàn)變化之后將最近的serverList推送給消費者,消費者在本地會緩存一份而芥。一個服務(wù)新注冊的時候律罢,會主動向注冊中心發(fā)送心跳。
dubbo是基于spring的命名空間加載的棍丐,spring在裝配bean 的時候误辑,遇上dubbo的命名空間,就會調(diào)用DubboNamespaceHandler來加載對象歌逢。
Dubbo會在Spring實例化完bean之后巾钉,在刷新容器最后一步發(fā)布ContextRefreshEvent事件的時候,通知實現(xiàn)了ApplicationListener的ServiceBean類進行回調(diào)onApplicationEvent 事件方法秘案,dubbo會在這個方法中調(diào)用ServiceBean父類ServiceConfig的export方法砰苍,而該方法真正實現(xiàn)了服務(wù)的(異步或者非異步)發(fā)布。
https://blog.csdn.net/yanpenglei/article/details/80261762
2阱高、export的步驟簡介
首先會檢查各種配置信息赚导,填充各種屬性,總之就是保證我在開始暴露服務(wù)之前赤惊,所有的東西都準(zhǔn)備好了吼旧,并且是正確的。
加載所有的注冊中心荐捻,因為我們暴露服務(wù)需要注冊到注冊中心中去黍少。
根據(jù)配置的所有協(xié)議和注冊中心url分別進行導(dǎo)出。
導(dǎo)出的具體操作:
1处面、loadRegistries方法構(gòu)造url的列表
2厂置、url的對象存儲的是注冊中心的消息,包括注冊中心的host地址魂角,協(xié)議昵济,application,類型(常用的是zk)等信息
3、循環(huán)列表访忿,調(diào)用doExportUrlsFor1Protocol方法將同一種協(xié)議發(fā)布到每一個注冊中心上
4瞧栗、doExportUrlsFor1Protocol方法:
1)、InetAddress.getLocalHost().getHostAddress()
2)海铆、獲取port等信息迹恐,沒有配置則獲取隨機可用端口
3)、將application卧斟,side殴边,method等參數(shù)解析到一個map里,application通過ApplicationConfig對象解析獲得珍语,method通過反射獲得
4)锤岸、將host,port板乙,map等信息構(gòu)造成一個url對象
5)是偷、如果配置的不是remote,則做本地導(dǎo)出募逞。如果配置的不是local蛋铆,則暴露為遠(yuǎn)程服務(wù)。
6)凡辱、proxyFactory構(gòu)造Invoker
7)戒职、獲取完Invoker之后,轉(zhuǎn)換成對外的Exporter透乾,緩存起來洪燥。
所有的provider都被解析成ServiceBean。ServiceBean實現(xiàn)了InitializingBean接口乳乌,繼承了ServiceConfig類捧韵。在afterProperties方法中對注冊中心等進行配置,配置完成后調(diào)用了export方法汉操,export方法中設(shè)置了延遲發(fā)布等配置再来,最后最核心的邏輯是調(diào)用doExport方法,將ip磷瘤,端口芒篷,方法,類名等拼成url暴露給注冊中心解析采缚。針對每一個注冊中心针炉,分別組裝url,進入RegistoryProtocol類的export方法扳抽,打開一個netty Server偵聽服務(wù)篡帕,并接受客戶端的各種請求殖侵,向注冊中心暴露服務(wù)。
doExport方法的核心邏輯镰烧,校驗application拢军,校驗注冊中心等,最后調(diào)用doExportUrls怔鳖。doExportUrls方法的邏輯是將同一種協(xié)議發(fā)布到不同的注冊中心上茉唉。發(fā)布的方法是doExportUrlsFor1Protocol。
doExportUrlsFor1Protocol步驟:獲取provider的host败砂,
服務(wù)的提供者和消費者之間的調(diào)用是不經(jīng)過注冊中心的赌渣,而是直接的調(diào)用,因此消費者也可以直接在配置中指定提供者的ip地址昌犹。
消費者調(diào)用過程:RegistryProtocol對象的refer()方法,根據(jù)url和服務(wù)接口構(gòu)造出invoker對象览芳,
八斜姥、數(shù)據(jù)庫
1、數(shù)據(jù)庫的范式
1沧竟、第一范式:每一個字段保證原子性
2铸敏、第二范式:表字段與主鍵有依賴關(guān)系
3、第三范式:表字段與主鍵的依賴要求直接依賴
2悟泵、數(shù)據(jù)庫索引為什么用樹
3杈笔、索引使用B+樹的好處,索引的原理
主鍵是唯一的聚集索引糕非,覆蓋了真實的數(shù)據(jù)蒙具,對其它字段加索引都是非聚集索引,非聚集索引是先找到主鍵朽肥,再通過主鍵查詢數(shù)據(jù)禁筏。如果兩個字段組成一個聯(lián)合索引,那么以一個字段為條件查詢另一個字段就不需要經(jīng)過表衡招,查詢效率也會很高
B+樹:每一個節(jié)點的葉子上限是2d篱昔。只有葉節(jié)點存儲data。
https://www.cnblogs.com/wuchanming/p/6886020.html
mysql聯(lián)合索引的最左前綴機制
http://www.reibang.com/p/e1dce41a6b2b
4始腾、數(shù)據(jù)庫樂觀鎖悲觀鎖
https://blog.csdn.net/xiaokang123456kao/article/details/75268240
5州刽、聚集索引和非聚集索引的區(qū)別
聚集索引,葉子為數(shù)據(jù)浪箭。非聚集索引穗椅,葉子為聚集索引
聚集索引物理順序?qū)?yīng)表數(shù)據(jù)的邏輯順序。非聚集不是
6山林、索引失效
1房待、索引存儲null值邢羔。或使用is null桑孩,會觸發(fā)全表掃描
2拜鹤、重復(fù)數(shù)據(jù)較多的列
3、模糊查詢'%xxx%'
4流椒、sql語句中有or或者not
7敏簿、 臟讀:事務(wù)A讀到了事務(wù)B未提交的數(shù)據(jù)
不可重復(fù)讀:事務(wù)A兩次查詢某一列的間隙,事務(wù)B對列進行了修改
幻讀:事務(wù)A先搜到了N條宣虾,事務(wù)B又加了M條惯裕,事務(wù)A第二次查詢時條數(shù)增加
九、設(shè)計模式
1绣硝、熟悉的設(shè)計模式
策略蜻势,責(zé)任鏈,builder鹉胖,工廠握玛,適配器,觀察者甫菠,模板方法挠铲,裝飾器,代理寂诱,
創(chuàng)建型:工廠拂苹,抽象工廠,單例痰洒,建造者瓢棒,原型
結(jié)構(gòu)型:適配器,裝飾器带迟,代理音羞,外觀,橋接仓犬,組合嗅绰,享元
行為型:策略,模板方法搀继,責(zé)任鏈窘面,觀察者,迭代子模式叽躯,命令财边,狀態(tài),備忘錄点骑,訪問者酣难,
十谍夭、分布式,高并發(fā)架構(gòu)類
1憨募、項目中如何解決高并發(fā)的問題
1紧索、在高頻率讀的數(shù)據(jù)加入緩存
2、注意并發(fā)的安全問題菜谣,在需要的地方使用同步容器或加鎖
3珠漂、加機器
4、避免循環(huán)查庫等消耗性能的操作
2尾膊、分布式環(huán)境下如何保證訂單號唯一
服務(wù)唯一編碼+時間戳+oracle自增序列
3媳危、微服務(wù)和SOA
4、分布式緩存的一致性hash
https://www.cnblogs.com/akaneblog/p/6736386.html
5冈敛、分布式系統(tǒng)間的事務(wù)一致性
CAP待笑,一致性,可用性抓谴,分區(qū)容忍性滋觉,不可兼得。分區(qū)容忍性是必須的齐邦,因此各類分布式中間件和框架,要么選擇弱化C第租,要么選擇弱化A措拇。
分布式事務(wù)算法:
1、2PC/3PC 兩階段提交或三階段提交慎宾。涉及到跨庫事務(wù)丐吓,每一個節(jié)點只能保證,也只能知道自己節(jié)點的成功與失敗趟据,無法知道其他節(jié)點券犁。因此引入一個協(xié)調(diào)者,或者叫參與者來掌控所有節(jié)點的操作結(jié)果并決定是否將事務(wù)提交汹碱。
第一階段:協(xié)調(diào)者問所有節(jié)點是否可以提交粘衬,各個節(jié)點自我檢查后回應(yīng)可以提交或者不可以
第二階段:所有的節(jié)點都回應(yīng)了可提交,那么協(xié)調(diào)者向所有參與者發(fā)送正式提交的命令咳促。如果有一個節(jié)點回應(yīng)不可提交稚新,那么協(xié)調(diào)者向所有參與者發(fā)送回滾請求。
兩段提交的最大問題跪腹,就是參與者如果沒有收到?jīng)Q策褂删,那么就會一直處于阻塞狀態(tài)。因此三段提交將提交修改為:詢問的時候不鎖資源冲茸,等到正式提交命令下達時再鎖資源
2屯阀、TCC
十一缅帘、Redis
1、redis線程模型
https://www.cnblogs.com/barrywxx/p/8570821.html
2难衰、redis的持久化機制
RDB钦无,AOF
3、mysql主從復(fù)制和redis主從復(fù)制的區(qū)別
4召衔、redis數(shù)據(jù)持久化 https://www.cnblogs.com/chenliangcl/p/7240350.html
5铃诬、redis緩存失效策略:
1、定時器 set值的時候就設(shè)置一個定時器
2苍凛、惰性 get的時候再判斷
3趣席、定期回收
6、redis數(shù)據(jù)淘汰策略:
數(shù)據(jù)集到一定大小醇蝴,就需要實行數(shù)據(jù)淘汰策略
redis 提供 6種數(shù)據(jù)淘汰策略:
volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
7宣肚、redis選舉機制:
哨兵機制:啟動多個哨兵對集群進行監(jiān)控。發(fā)現(xiàn)異常就報告給管理員悠栓,或自動進行故障遷移霉涨。將失效的Master的其中一個Salve選舉為新的Master。
從主服務(wù)器的從服務(wù)器中選出一個從服務(wù)器作為新的主服務(wù)器惭适。選點的依據(jù)依次是:網(wǎng)絡(luò)連接正常->5秒內(nèi)回復(fù)過INFO命令->10*down-after-milliseconds內(nèi)與主連接過的->從服務(wù)器優(yōu)先級->復(fù)制偏移量->運行id較小的笙瑟。選出之后通過slaveif no ont將該從服務(wù)器升為新主服務(wù)器
當(dāng)主服務(wù)器宕機之后,從服務(wù)器切換成主服務(wù)器的時間內(nèi)癞志,服務(wù)是不可用的
十二往枷、MQ
1、MQ重復(fù)消費
業(yè)務(wù)上冪等
2凄杯、mq重發(fā)機制错洁,nameServer掛了之后還能不能接著發(fā)消息
3、
十三戒突、網(wǎng)絡(luò)類
1屯碴、TCP和UDP的區(qū)別
2、HTTP協(xié)議
十四膊存、算法导而,數(shù)據(jù)結(jié)構(gòu)
1、鏈表反轉(zhuǎn)
1.就地反轉(zhuǎn)法 public ListNode reverseList1(ListNode head) { if (head == null) return head; ListNode dummy = new ListNode(-1); dummy.next = head; ListNode prev = dummy.next; ListNode pCur = prev.next; while (pCur != null) { prev.next = pCur.next; pCur.next = dummy.next; dummy.next = pCur; pCur = prev.next; } return dummy.next; }
2膝舅、N個數(shù)字找K個最大值
1嗡载、小頂堆 時間復(fù)雜度O(NlogK)
2、分成很多份仍稀,每份再做小頂堆或者直接快排洼滚,可以發(fā)揮多核優(yōu)勢
3、bitmap去重
3技潘、動態(tài)規(guī)劃 https://blog.csdn.net/rock_joker/article/details/68928150
4遥巴、快排千康,紅黑樹
十五、Linux
1铲掐、linux常用命令 https://www.cnblogs.com/irisrain/p/4346086.html
◆ 安裝和登錄命令:login拾弃、shutdown關(guān)閉計算機、halt 等于就是shutdown -h關(guān)機后關(guān)電源摆霉、reboot重啟豪椿、install、mount携栋、umount搭盾、chsh更改shell設(shè)定、exit退出系統(tǒng)婉支、last顯示近期用戶的登錄狀況鸯隅;
◆ 文件處理命令:file判斷文件類型、mkdir向挖、grep蝌以、dd復(fù)制文件、find目錄中搜索文件何之、mv移動文件跟畅,也可以用來重命名、ls溶推、diff兩個文件之間的比較碍彭、cat、ln文件之間創(chuàng)建連接悼潭;
◆ 系統(tǒng)管理相關(guān)命令:df檢查文件系統(tǒng)的磁盤占用、top顯示執(zhí)行中的文件進程舞箍、free顯示內(nèi)存占用比例舰褪、quota、at疏橄、lp打印文件占拍、adduser、groupadd將新組加入系統(tǒng)捎迫、kill晃酒、crontab;
◆ 網(wǎng)絡(luò)操作命令:ifconfig查看和更改ip地址廣播地址等窄绒、ip -s輸出狀態(tài) -f接協(xié)議種類 贝次、ping -c設(shè)置完成要求回應(yīng)的次數(shù) -R記錄路由過程 、netstat 查看自身網(wǎng)絡(luò)情況 彰导、telnet 連接遠(yuǎn)程端口蛔翅、ftp遠(yuǎn)程文件傳輸敲茄、route -add 增加路由、rlogin山析、rcp遠(yuǎn)程文件拷貝 -r遞歸拷貝目錄 堰燎、finger查詢登陸賬號的信息 -s -l、mail笋轨、 nslookup秆剪;scp scp file_path_1 root@192.168.1.1:file_path_2 遠(yuǎn)程file2拷貝到本地file1
◆ 系統(tǒng)安全相關(guān)命令:passwd、su爵政、umask仅讽、chgrp、chmod茂卦、chown何什、chattr、sudo ps等龙、who处渣;
◆ 其它命令:tar、unzip蛛砰、gunzip罐栈、unarj、mtools泥畅、man荠诬、unendcode、uudecode
十六位仁、NIO
https://blog.csdn.net/chen8238065/article/details/48315085#%E7%9B%B8%E5%85%B3%E8%B5%84%E6%96%99
https://segmentfault.com/a/1190000003063859
https://blog.csdn.net/u014507083/article/details/73784898
十七柑贞、操作系統(tǒng)
1、死鎖發(fā)生的條件和解決方案
死鎖產(chǎn)生的條件:
1聂抢、互斥條件:資源不能被共享钧嘶,只能由一個進程使用
2、請求與保持條件:進程已獲得了一些資源琳疏,但因請求其它資源被阻塞時有决,對已獲得的資源保持不放。
3空盼、不可搶占條件(No pre-emption) :有些系統(tǒng)資源是不可搶占的书幕,當(dāng)某個進程已獲得這種資源后,系統(tǒng)不能強行收回揽趾,只能由進程使用完時自己釋放台汇。
4、循環(huán)等待條件(Circular wait) :若干個進程形成環(huán)形鏈,每個都占用對方申請的下一個資源励七。
處理死鎖的方法:
1智袭、鴕鳥算法:
2、銀行家算法:
對待死鎖的策略主要有:
(1) 死鎖預(yù)防:破壞導(dǎo)致死鎖必要條件中的任意一個就可以預(yù)防死鎖掠抬。例如吼野,要求用戶申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件两波;將資源分層瞳步,得到上一層資源后,才能夠申請下一層資源腰奋,它破壞了環(huán)路等待條件单起。預(yù)防通常會降低系統(tǒng)的效率。
(2) 死鎖避免:避免是指進程在每次申請資源時判斷這些操作是否安全劣坊,例如嘀倒,使用銀行家算法。死鎖避免算法的執(zhí)行會增加系統(tǒng)的開銷局冰。
(3) 死鎖檢測:死鎖預(yù)防和避免都是事前措施测蘑,而死鎖的檢測則是判斷系統(tǒng)是否處于死鎖狀態(tài),如果是康二,則執(zhí)行死鎖解除策略碳胳。
(4) 死鎖解除:這是與死鎖檢測結(jié)合使用的,它使用的方式就是剝奪沫勿。即將某進程所擁有的資源強行收回挨约,分配給其他的進程。