1、hashcode相等兩個(gè)類一定相等嗎?equals呢?相反呢?
結(jié)論:equals 相等的 hashcode一定相等全闷,反之不一定幅聘。
原因:在java中捺疼,equals和hashcode是有設(shè)計(jì)要求的,equals相等怎爵,則hashcode一定相等特石,反之則不然。?
為何會(huì)有這樣的要求鳖链??
在集合中姆蘸,比如HashSet中,要求放入的對(duì)象不能重復(fù)芙委,怎么判定呢逞敷??
首先會(huì)調(diào)用hashcode,如果hashcode相等灌侣,則繼續(xù)調(diào)用equals推捐,也相等,則認(rèn)為重復(fù)侧啼。如果重寫equals后牛柒,如果不重寫hashcode堪簿,則hashcode就是繼承自O(shè)bject的,返回內(nèi)存編碼焰络,這時(shí)候可能出現(xiàn)equals相等戴甩,而hashcode不等,你的對(duì)象使用集合時(shí)闪彼,就會(huì)等不到正確的結(jié)果甜孤。
3畏腕、hashmap hastable 底層實(shí)現(xiàn)什么區(qū)別?hashtable和concurrenthashtable呢?
hashmap 和hashtable基本上一樣缴川,只不過hashtable是線程安全的,而hashmap 是線程不安全的描馅。而concurrenthashtable跟hashtable的區(qū)別在于把夸,concurrenthashtable是基于用了分段鎖的設(shè)計(jì),只有在同一個(gè)分段內(nèi)才存在競態(tài)關(guān)系铭污,不同的分段鎖之間沒有鎖競爭恋日。相比于對(duì)整個(gè)Map加鎖的設(shè)計(jì),分段鎖大大的提高了高并發(fā)環(huán)境下的處理能力嘹狞。但同時(shí)岂膳,由于不是對(duì)整個(gè)Map加鎖,導(dǎo)致一些需要掃描整個(gè)Map的方法(如size(), containsValue())需要使用特殊的實(shí)現(xiàn)磅网,另外一些方法(如clear())甚至放棄了對(duì)一致性的要求(ConcurrentHashMap是弱一致性的谈截,具體請查看ConcurrentHashMap能完全替代HashTable嗎?)涧偷。
4簸喂、hashmap和treemap什么區(qū)別?低層數(shù)據(jù)結(jié)構(gòu)是什么?
hashmap底層是數(shù)組加鏈表結(jié)構(gòu),數(shù)組用來根據(jù)key的hashcode值來定位一個(gè)對(duì)象應(yīng)該屬于哪一個(gè)index燎潮,而鏈表結(jié)構(gòu)可以解決當(dāng)key的hashcode值相等而equals方法值不相等的問題喻鳄。,而treemap底層是紅黑樹結(jié)構(gòu)跟啤,紅黑樹的結(jié)構(gòu)是為了兼顧增刪改查的多維度性能而設(shè)計(jì)的诽表。
5、線程池用過嗎都有什么參數(shù)?底層如何實(shí)現(xiàn)的?
publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TimeUnit unit,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BlockingQueue workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,? ? ? ? ? ? Executors.defaultThreadFactory(), defaultHandler);? ? }
1.corePoolSize:線程池中默認(rèn)保留線程數(shù)量隅肥,即便是線程是空閑線程。
2.maximumPoolSize:線程池中保留的最大數(shù)量的線程袄简。
3.keepAliveTime:當(dāng)線程數(shù)量大于corePoolSize 之后腥放,線程在空閑情況下最長保留時(shí)間。
4.unit:keepAliveTime的時(shí)間單位绿语,包括天秃症、小時(shí)候址,分鐘,秒种柑,微妙岗仑,毫秒,納秒聚请。
5.workQueue:一個(gè)阻塞隊(duì)列荠雕,用來存儲(chǔ)等待執(zhí)行的任務(wù),包括:ArrayBlockingQueue(有界阻塞隊(duì)列驶赏,在隊(duì)列達(dá)到一定)炸卑,LinkedBlockingQueue,SynchronousQueue煤傍,其中LinkedBlockingQueue(鏈表阻塞隊(duì)列盖文,包括了讀鎖和寫鎖,而ArrayBlockingQueue只有一個(gè)鎖蚯姆,所以效率相對(duì)LinkedBlockingQueue會(huì)慢一些)和SynchronousQueue(同步阻塞隊(duì)列五续,它沒有容器,生產(chǎn)之后就需要有消費(fèi)者來消費(fèi))比較常用龄恋。
6.threadFactory:線程工廠疙驾,主要用來創(chuàng)建線程的工廠。
7.handler:表示當(dāng)拒絕任務(wù)處理時(shí)的策略篙挽。有四種取值:?
1.ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常荆萤。
2.ThreadPoolExecutor.DiscardPolicy:也是丟棄任務(wù),但是不拋出異常铣卡。
3.ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊(duì)列最前面的任務(wù)链韭,然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程)
4.ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)
6、sychnized和Lock什么區(qū)別?sychnize 什么情況情況是對(duì)象鎖? 什么時(shí)候是全局鎖為什么?
1.synchnized 是關(guān)鍵字煮落,在方法出錯(cuò)之后由java虛擬機(jī)自動(dòng)解除鎖定敞峭,而 Lock屬于Api級(jí)別的鎖,它需要自己在 finally方法后面保證鎖的釋放蝉仇。
2.synchnized 不能實(shí)現(xiàn)公平鎖旋讹,而 Lock可以,Lock還可以添加多個(gè)監(jiān)聽條件來對(duì)鎖進(jìn)行控制轿衔,可以中斷沉迹。
3.synchronized 作用在普通方法上屬于對(duì)象鎖,作用在靜態(tài)方法害驹,類.class 上面鞭呕,屬于全局鎖。對(duì)象鎖只對(duì)同一個(gè)對(duì)象加鎖宛官,作用對(duì)象是同一個(gè)對(duì)象葫松。而類鎖是對(duì)類加鎖瓦糕,對(duì)整個(gè)類都有效。?
如果鎖住的是一般方法就是對(duì)象鎖腋么,對(duì)象鎖只會(huì)對(duì)同一個(gè)對(duì)象起作用咕娄,如果是鎖住了static 方法則是全局鎖,會(huì)對(duì)全局對(duì)象都管用珊擂,如果想在普通方法中使用全局鎖需要鎖住class對(duì)象圣勒。
7、ThreadLocal 是什么底層如何實(shí)現(xiàn)?寫一個(gè)例子唄?
ThreadLocal 底層是存儲(chǔ)在 線程本地Map里面的一個(gè)對(duì)象未玻,它跟當(dāng)前線程綁定灾而,以 ThreadLocal 對(duì)象本身為 key,以ThreadLocal里面存的值為值扳剿,目的是為了實(shí)現(xiàn)線程之間的數(shù)據(jù)的隔離旁趟。
publicstaticfinal ThreadLocal session =newThreadLocal();publicstaticSessiongetCurrentSession() {? ? ? ? ? Session s = (Session)session.get();if(s ==null){? ? ? ? ? ? ? s = sessionFactory.openSession();? ? ? ? ? ? ? session.set(s);? ? ? ? ? }returns;? ? ? }
線程安全需要3步驟:?
1.操作的原子性(要么全部成功庇绽,要不全部失斘选)?
2.操作的可見性(所有線程都可見)?
3.操作的有序性。而對(duì)于volatile的只能保證可見性瞧掺,所以對(duì)于 i=i++這種操作是不具有原子性的耕餐,所以這類的操作無法使用 volatile關(guān)鍵字進(jìn)行修飾。
使用場景:
1.狀態(tài)標(biāo)記
volatilebooleanshutdownRequested;? ...publicvoidshutdown() {? ? ? shutdownRequested =true;? }publicvoiddoWork() {while(!shutdownRequested) {// do stuff? }? }
2.一次性安全發(fā)布(one-time safe publication):單例模式的雙重檢查
packagecom.masterslave.singleton;/**
* 雙重檢查
*/publicclassDoubleCheck{/**
? ? * 因?yàn)閕nstance被聲明成了 volatile 所以辟狈,
? ? * 每次得到的對(duì)象都是主內(nèi)存中最新的對(duì)象狀態(tài)肠缔,所以保證了實(shí)例的可見性
? ? */privatevolatilestaticDoubleCheck instance;privateDoubleCheck() {? ? }/**? ? * 雙重檢查保證線程安全? ? * @return*/publicstaticDoubleCheckgetInstance() {if(instance ==null) {synchronized(instance) {if(instance ==null) {? ? ? ? ? ? ? ? ? instance =newDoubleCheck();? ? ? ? ? ? ? }? ? ? ? ? }? ? ? }returninstance;? ? }}
3.獨(dú)立觀察(independent observation)?
如下代碼展示了身份驗(yàn)證機(jī)制如何記憶最近一次登錄的用戶的名字。將反復(fù)使用lastUser 引用來發(fā)布值哼转,以供程序的其他部分使用明未。
publicclassUserManager{publicvolatileString lastUser;//發(fā)布的信息? publicbooleanauthenticate(String user, String password) {booleanvalid = passwordIsValid(user, password);if(valid) {? ? ? ? ? ? ? User u =newUser();? ? ? ? ? ? ? activeUsers.add(u);? ? ? ? ? ? ? lastUser = user;? ? ? ? ? }returnvalid;? ? ? }? }
4.開銷較低的“讀-寫鎖”策略?
如果讀操作遠(yuǎn)遠(yuǎn)超過寫操作,您可以結(jié)合使用內(nèi)部鎖和 volatile 變量來減少公共代碼路徑的開銷壹蔓。
@ThreadSafepublicclassCheesyCounter {// Employs the cheap read-write lock trick? // All mutative operations MUST be done with the 'this' lock held? @GuardedBy("this")privatevolatileintvalue;//讀操作趟妥,沒有synchronized,提高性能? publicintgetValue() {returnvalue;? ? ? }//寫操作佣蓉,必須synchronized披摄。因?yàn)閤++不是原子操作? publicsynchronizedintincrement() {returnvalue++;? ? ? }
15
Compare and Swap 比較并刷新到緩存勇凭。通過比較線程舊值跟內(nèi)存中的值是否相等來判斷當(dāng)前的值能否刷新到緩存中疚膊。
餓漢模式:
packagecom.masterslave.singleton;/**
* 餓漢模式
*/publicclassHungry{privatestaticHungry instance =newHungry();privateHungry() {? ? }publicstaticHungrygetInstance() {returninstance;? ? }}
懶漢模式
packagecom.masterslave.singleton;/**
* 懶漢模式
*/publicclassLazy{privatestaticLazy instance;privateLazy() {? ? }/**? ? * 使用 synchronized 解決線程安全問題? ? * @return*/synchronizedpublicstaticLazygetInstance() {if(instance ==null) {? ? ? ? ? ? instance =newLazy();? ? ? ? }returninstance;? ? }}
雙重檢查
packagecom.masterslave.singleton;/**
* 雙重檢查
*/publicclassDoubleCheck{/**
? ? * 因?yàn)閕nstance被聲明成了 volatile 所以虾标,
? ? * 每次得到的對(duì)象都是主內(nèi)存中最新的對(duì)象狀態(tài)酿联,所以保證了實(shí)例的可見性
? ? */privatevolatilestaticDoubleCheck instance;privateDoubleCheck() {? ? }/**? ? * 雙重檢查保證線程安全? ? * @return*/publicstaticDoubleCheckgetInstance() {if(instance ==null) {synchronized(instance) {if(instance ==null) {? ? ? ? ? ? ? ? ? instance =newDoubleCheck();? ? ? ? ? ? ? }? ? ? ? ? }? ? ? }returninstance;? ? }}
靜態(tài)內(nèi)部類
packagecom.masterslave.singleton;/**
* 靜態(tài)內(nèi)部類
*/publicclassInnerStaticClass{staticclass InnerClass{/**
? ? ? ? * 由于靜態(tài)單例對(duì)象沒有作為 InnerStaticClass 的成員變量直接實(shí)例化,
? ? ? ? * 因此類加載時(shí)不會(huì)實(shí)例化 instance 對(duì)象夺巩,
? ? ? ? * 第一次調(diào)用 getInstance 時(shí)將加載內(nèi)部類 InnerClass贞让,
? ? ? ? * 在該類內(nèi)部定義了一個(gè) instance 變量,此時(shí)首先會(huì)初始化這個(gè)變量柳譬,
? ? ? ? * 由java虛擬機(jī)來保證線程安全性喳张,確保改成員變量只能實(shí)例化一次,
? ? ? ? * 由于沒有任何鎖定美澳,所以其性能不會(huì)受到任何影響销部。
? ? ? ? */privatefinalstaticInnerStaticClass instance =newInnerStaticClass();? ? }privateInnerStaticClass() {? ? }publicstaticInnerStaticClassgetInstance() {returnInnerClass.instance;? ? }}
幾種模式性能比較:?
- 1.餓漢模式不論使用不使用都會(huì)初始化。?
- 2.懶漢模式存在鎖制跟,對(duì)性能有影響舅桩。?
- 3.雙重檢查也存在鎖,對(duì)性能有影響雨膨。?
- 4.靜態(tài)內(nèi)部類性能最好擂涛。
1、請介紹一下JVM內(nèi)存模型??用過什么垃圾回收器都說說唄
jvm包括2方面:?
1.1.線程私有區(qū):?
1.程序計(jì)數(shù)器聊记,記錄正在執(zhí)行的虛擬機(jī)字節(jié)碼的地址撒妈。?
2.虛擬機(jī)棧:方法執(zhí)行的內(nèi)存區(qū),每個(gè)方法執(zhí)行時(shí)會(huì)在虛擬機(jī)棧中創(chuàng)建棧幀排监。?
3.本地方法棧:虛擬機(jī)的Native方法執(zhí)行的內(nèi)存區(qū)狰右。?
1.2.線程共享區(qū):?
1.Java堆:對(duì)象分配內(nèi)存的區(qū)域;?
2.方法區(qū):也稱為持久代?
3.常量池:存放編譯器生成的各種字面量和符號(hào)引用舆床,是方法區(qū)的一部分棋蚌。
2、線上發(fā)送頻繁full gc如何處理? CPU 使用率過高怎么辦?
Partial GC:并不收集整個(gè)GC堆的模式Y(jié)oung GC:只收集young gen的GC
Old GC:只收集old gen的GC挨队。只有CMS的concurrent collection是這個(gè)模式
Mixed GC:收集整個(gè)young gen以及部分old gen的GC谷暮。只有G1有這個(gè)模式
Full GC:收集整個(gè)堆,包括young gen瞒瘸、old gen坷备、perm gen(如果存在的話)等所有部分的模式。
full gc 需要先定位然后找出問題之后再具體解決情臭,比如使用visualvm 工具先定位出現(xiàn)問題的原因省撑,在jvm參數(shù)上配置如下參數(shù),在發(fā)生full GC之前先把堆內(nèi)容給備份一下俯在。
-Xmx2g-XX:+HeapDumpBeforeFullGC-XX:HeapDumpPath=. -Xloggc:gc.log-XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+UseGCLogFileRotation-XX:NumberOfGCLogFiles=10-XX:GCLogFileSize=100m-XX:HeapDumpOnOutOfMemoryError
3竟秫、知道字節(jié)碼嗎?字節(jié)碼都有哪些?Integer x =5,int y =5,比較x =y 都經(jīng)過哪些步驟?
4跷乐、講講類加載機(jī)制唄都有哪些類加載器肥败,這些類加載器都加載哪些文件?
1.啟動(dòng)類加載器
2.擴(kuò)展類加載器
3.應(yīng)用類加載器
4.自定義加載器?
手寫一下類加載Demo
importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.nio.ByteBuffer;importjava.nio.channels.Channels;importjava.nio.channels.FileChannel;importjava.nio.channels.WritableByteChannel;publicclassMyClassLoaderextendsClassLoader{publicMyClassLoader()? ? ? {? ? ? }publicMyClassLoader(ClassLoader parent)? ? ? {super(parent);? ? ? }protectedClassfindClass(String name)throwsClassNotFoundException? ? ? {? ? ? ? ? File file =newFile("D:/People.class");try{byte[] bytes = getClassBytes(file);//defineClass方法可以把二進(jìn)制流字節(jié)組成的文件轉(zhuǎn)換為一個(gè)java.lang.Class? Class c =this.defineClass(name, bytes,0, bytes.length);returnc;? ? ? ? ? }catch(Exception e)? ? ? ? ? {? ? ? ? ? ? ? e.printStackTrace();? ? ? ? ? }returnsuper.findClass(name);? ? ? }privatebyte[]getClassBytes(File file)throwsException? ? ? {// 這里要讀入.class的字節(jié),因此要使用字節(jié)流? FileInputStream fis =newFileInputStream(file);? ? ? ? ? FileChannel fc = fis.getChannel();? ? ? ? ? ByteArrayOutputStream baos =newByteArrayOutputStream();? ? ? ? ? WritableByteChannel wbc = Channels.newChannel(baos);? ? ? ? ? ByteBuffer by = ByteBuffer.allocate(1024);while(true){inti = fc.read(by);if(i ==0|| i == -1)break;? ? ? ? ? ? ? by.flip();? ? ? ? ? ? ? wbc.write(by);? ? ? ? ? ? ? by.clear();? ? ? ? ? }? ? ? ? ? fis.close();returnbaos.toByteArray();? ? ? }? }
5、知道osgi嗎? 他是如何實(shí)現(xiàn)的?
你可以動(dòng)態(tài)地安裝馒稍、卸載皿哨、啟動(dòng)、停止不同的應(yīng)用模塊纽谒,而不需要重啟容器证膨。
6、請問你做過哪些JVM優(yōu)化?使用什么方法達(dá)到什么效果?
Class.forName() 會(huì)初始化對(duì)象央勒,而String.class.getClassLoader 不會(huì)。?
Class.forName(className)方法澳化,內(nèi)部實(shí)際調(diào)用的方法是Class.forName(className,true,classloader);?
第2個(gè)boolean參數(shù)表示類是否需要初始化崔步,?Class.forName(className)默認(rèn)是需要初始化。?
一旦初始化缎谷,就會(huì)觸發(fā)目標(biāo)對(duì)象的 static塊代碼執(zhí)行井濒,static參數(shù)也也會(huì)被再次初始化。?
ClassLoader.loadClass(className)方法慎陵,內(nèi)部實(shí)際調(diào)用的方法是 ClassLoader.loadClass(className,false);?
第2個(gè) boolean參數(shù)眼虱,表示目標(biāo)對(duì)象是否進(jìn)行鏈接,false表示不進(jìn)行鏈接席纽,由上面介紹可以捏悬,不進(jìn)行鏈接意味著不進(jìn)行包括初始化等一些列步驟,那么靜態(tài)塊和靜態(tài)對(duì)象就不會(huì)得到執(zhí)行润梯。
1过牙、spring都有哪些機(jī)制啊AOP底層如何實(shí)現(xiàn)的啊IOC呢?
1.IOC、AOP
2.IOC的實(shí)現(xiàn)方式就是就是反射和CGLIB纺铭。
2寇钉、cgLib知道嗎?他和jdk動(dòng)態(tài)代理什么區(qū)別?手寫一個(gè)jdk動(dòng)態(tài)代理唄?
cglib 代理的是普通的類,而jdk代理的是接口舶赔。jdk 只能代理接口扫倡,而cglib只能代理普通類,可以在spring配置中強(qiáng)制使用cglib代理竟纳。
<aop:aspectj-autoproxyproxy-target-class="true"/>)撵溃。
1、使用mysq索引都有哪些原則? 索引什么數(shù)據(jù)結(jié)構(gòu)?
1.選擇維度高
2.選擇 where锥累、on缘挑、group by、order by中出現(xiàn)的列桶略。
3.選擇較小的數(shù)據(jù)列语淘。
4.為較長的字符串使用前綴索引
5.組合索引能夠減小索引文件大小诲宇,使用速度也優(yōu)于單列索引
6.勿濫用索引,因?yàn)樗饕苏敬疟P空間意外惶翻,在進(jìn)行增姑蓝、刪、改操作的時(shí)候维贺,每次都要重新建立索引它掂。
7.索引不會(huì)包含有 NULL值得列,若組合索引包含有NULL值得列溯泣,整個(gè)索引無效
8.使用索引盡量避免使用 OR,否定查詢榕茧,模糊查詢垃沦,NOT IN,“<>”操作用押。
9.組合索引的最左前綴原則
2肢簿、mysq有哪些存儲(chǔ)引擎啊?都有啥區(qū)別? 要詳細(xì)!
1.MyISAM存儲(chǔ)引擎:不支持事務(wù)、也不支持外鍵蜻拨,優(yōu)勢是訪問速度快池充,對(duì)事務(wù)完整性沒有 要求或者以select,insert為主的應(yīng)用基本上可以用這個(gè)引擎來創(chuàng)建表?
2.該存儲(chǔ)引擎提供了具有提交缎讼、回滾和崩潰恢復(fù)能力的事務(wù)安全收夸。但是對(duì)比MyISAM引擎,寫的處理效率會(huì)差一些血崭,并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引卧惜。?
InnoDB存儲(chǔ)引擎的特點(diǎn):支持自動(dòng)增長列,支持外鍵約束
3夹纫、設(shè)計(jì)高并發(fā)系統(tǒng)數(shù)據(jù)庫層面該怎么設(shè)計(jì)?數(shù)據(jù)庫鎖有哪些類型?如何實(shí)現(xiàn)呀?
1.垂直拆分咽瓷,根據(jù)業(yè)務(wù)拆分表。
2.水平拆分舰讹,根據(jù)id進(jìn)行取模放入到不同數(shù)據(jù)庫中茅姜。
3.垂直拆分+水平拆分。
原子性(Atomicity):事務(wù)作為一個(gè)整體被執(zhí)行钻洒,包含在其中的對(duì)數(shù)據(jù)庫的操作要么全部被執(zhí)行,要么都不執(zhí)行桶错。?
一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)航唆。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束。?
隔離性(Isolation):多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)院刁,一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行糯钙。?
持久性(Durability):一個(gè)事務(wù)一旦提交,他對(duì)數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中。
1任岸、如何設(shè)計(jì)可以動(dòng)態(tài)擴(kuò)容縮容的分庫分表方案?
2再榄、用過哪些分庫分表中間件,有啥優(yōu)點(diǎn)和缺點(diǎn)?講一下你了解的分庫分表中間件的底層實(shí)現(xiàn)原理?
7猜敢、如何解決分庫分表主鍵問題有什么實(shí)現(xiàn)方案??
主鍵不采用自增策略姑荷,而采用統(tǒng)一主鍵生成規(guī)則。
1缩擂、redis和memcheched 什么區(qū)別為什么單線程的redis比多線程的memched效率要高啊?
相同點(diǎn):都是使用的多路io復(fù)用的方式鼠冕,減少了阻塞,充分的利用cpu和內(nèi)存性能胯盯。?
不同點(diǎn):redis單進(jìn)程單線程懈费,Memcache 多進(jìn)程單線程,redis自己寫了一套epoll的實(shí)現(xiàn)陨闹,而Memcache 使用的是Libevent楞捂,這個(gè)組件本身比較大,有很多無用代碼趋厉,對(duì)Memcache性能有影響寨闹,還有就是Memcache采用的CAS這種方式也會(huì)對(duì)性能造成影響。
2君账、redis有什么數(shù)據(jù)類型都在哪些場景下使用啊?
3繁堡、reids的主從復(fù)制是怎么實(shí)現(xiàn)的redis的集群模式是如何實(shí)現(xiàn)的呢redis的key是如何尋址的啊?
1.全量同步
Redis全量復(fù)制一般發(fā)生在Slave初始化階段,這時(shí)Slave需要將Master上的所有數(shù)據(jù)都復(fù)制一份乡数。具體步驟如下:?
1)從服務(wù)器連接主服務(wù)器椭蹄,發(fā)送SYNC命令;?
2)主服務(wù)器接收到SYNC命名后净赴,開始執(zhí)行BGSAVE命令生成RDB文件并使用緩沖區(qū)記錄此后執(zhí)行的所有寫命令绳矩;?
3)主服務(wù)器BGSAVE執(zhí)行完后,向所有從服務(wù)器發(fā)送快照文件玖翅,并在發(fā)送期間繼續(xù)記錄被執(zhí)行的寫命令翼馆;?
4)從服務(wù)器收到快照文件后丟棄所有舊數(shù)據(jù)割以,載入收到的快照;?
5)主服務(wù)器快照發(fā)送完畢后開始向從服務(wù)器發(fā)送緩沖區(qū)中的寫命令应媚;?
6)從服務(wù)器完成對(duì)快照的載入严沥,開始接收命令請求,并執(zhí)行來自主服務(wù)器緩沖區(qū)的寫命令中姜;
2.增量同步
RedisSlave初始化后開始正常工作時(shí)主服務(wù)器發(fā)生的寫操作同步到從服務(wù)器的過程消玄。?
增量復(fù)制的過程主要是主服務(wù)器每執(zhí)行一個(gè)寫命令就會(huì)向從服務(wù)器發(fā)送相同的寫命令,從服務(wù)器接收并執(zhí)行收到的寫命令丢胚。
3.同步策略
主從剛剛連接的時(shí)候翩瓜,進(jìn)行全量同步;全同步結(jié)束后嗜桌,進(jìn)行增量同步奥溺。當(dāng)然,如果有需要骨宠,slave 在任何時(shí)候都可以發(fā)起全is 策略是,無論如何相满,首先會(huì)嘗試進(jìn)行增量同步层亿,如不成功,要求從機(jī)進(jìn)行全量同步立美。
4.注意點(diǎn)
如果多個(gè)Slave斷線了匿又,需要重啟的時(shí)候,因?yàn)橹灰猄lave啟動(dòng)建蹄,就會(huì)發(fā)送sync請求和主機(jī)全量同步碌更,當(dāng)多個(gè)同時(shí)出現(xiàn)的時(shí)候,可能會(huì)導(dǎo)致Master IO劇增宕機(jī)洞慎。
4痛单、使用redis如何設(shè)計(jì)分布式鎖?使用zk可以嗎?如何實(shí)現(xiàn)啊這兩種哪個(gè)效率更高啊??
5、知道redis的持久化嗎都有什么缺點(diǎn)優(yōu)點(diǎn)啊? ?具體底層實(shí)現(xiàn)呢?
6劲腿、redis過期策略都有哪些LRU 寫一下java版本的代碼吧??
1旭绒、說一下dubbo的實(shí)現(xiàn)過程注冊中心掛了可以繼續(xù)通信嗎??
2、zk原理知道嗎zk都可以干什么Paxos算法知道嗎?說一下原理和實(shí)現(xiàn)??
3焦人、dubbo支持哪些序列化協(xié)議?hessian 說一下hessian的數(shù)據(jù)結(jié)構(gòu)PB知道嗎為啥PB效率是最高的啊??
4挥吵、知道netty嗎’netty可以干嘛呀NIO,BIO,AIO 都是什么啊有什么區(qū)別啊?
5、dubbo復(fù)制均衡策略和高可用策略都有哪些啊動(dòng)態(tài)代理策略呢?
6花椭、為什么要進(jìn)行系統(tǒng)拆分啊拆分不用dubbo可以嗎’dubbo和thrift什么區(qū)別啊?
1忽匈、為什么使用消息隊(duì)列啊消息隊(duì)列有什么優(yōu)點(diǎn)和缺點(diǎn)啊?
2、如何保證消息隊(duì)列的高可用啊如何保證消息不被重復(fù)消費(fèi)啊
3矿辽、kafka 丹允,activemq,rabbitmq 郭厌,rocketmq都有什么優(yōu)點(diǎn),缺點(diǎn)啊???
4嫌松、如果讓你寫一個(gè)消息隊(duì)列沪曙,該如何進(jìn)行架構(gòu)設(shè)計(jì)啊?說一下你的思路
1、es的工作過程實(shí)現(xiàn)是如何的?如何實(shí)現(xiàn)分布式的啊
2萎羔、es在數(shù)據(jù)量很大的情況下( 數(shù)十億級(jí)別)如何提高查詢效率啊?
3液走、es的查詢是一個(gè)怎么的工作過程?底層的lucence介紹一下唄倒排索引知道嗎?es和mongdb什么區(qū)別啊都在什么場景下使用啊?
1、如何設(shè)計(jì)一個(gè)高并發(fā)高可用系統(tǒng)
2贾陷、如何限流?工程中怎么做的缘眶,說一下具體實(shí)現(xiàn)
3、緩存如何使用的緩存使用不當(dāng)會(huì)造成什么后果?
4髓废、如何熔斷啊?熔斷框架都有哪些?具體實(shí)現(xiàn)原理知道嗎?
5巷懈、如何降級(jí)如何進(jìn)行系統(tǒng)拆分,如何數(shù)據(jù)庫拆分????
通信協(xié)議
2顶燕、http的工作流程?? ?http1.0 http1.1http2.0 具體哪些區(qū)別啊?
3、TCP三次握手冈爹,四層分手的工作流程畫一下流程圖為什么不是四次五次或者二次啊?
4涌攻、畫一下https的工作流程?具體如何實(shí)現(xiàn)啊?如何防止被抓包啊??
算法
1、比較簡單频伤,我一個(gè)文件恳谎,有45億個(gè)阿拉伯?dāng)?shù)字,如何進(jìn)行去重啊如何找出最大的那個(gè)數(shù)啊?
數(shù)據(jù)結(jié)構(gòu)
源碼中所用到的經(jīng)典設(shè)計(jì)思想用設(shè)計(jì)模式
及常用設(shè)計(jì)模式
如果您Java學(xué)習(xí)的過程中遇到難題,歡迎關(guān)注微信公眾號(hào)【潭州筑夢Java】岸更,大家一起交流討論解決鸵膏!