spring的兩大特點(diǎn):
IOC:控制反轉(zhuǎn),將原本在程序中手動對象創(chuàng)建的控制權(quán)交給spring框架管理。就是一種容器,IoC 容器是 Spring 用來實(shí)現(xiàn) IoC 的載體, IoC 容器實(shí)際上就是個Map(key,value),Map 中存放的是各種對象。將對象之間的相互依賴關(guān)系交給 IoC 容器來管理,并由 IoC 容器完成對象的注入。
AOP:一種思想,可以理解成面向切面編程,它的能力是什么呢?讓一個本沒有實(shí)現(xiàn)一個接口的實(shí)現(xiàn)類通過代理的模式讓他去實(shí)現(xiàn)那個沒有實(shí)現(xiàn)的接口 使業(yè)務(wù)達(dá)到可控的效果。
springboot 自動裝配原理:
springboot根據(jù)通過配置文件自動裝配所屬依賴的類,在用動態(tài)代理的方式注入到spring容器里面。
HashMap底層原理:
首先HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。
還有就是它的一個數(shù)據(jù)結(jié)構(gòu)是數(shù)組加鏈表的形式。當(dāng)我們往Hashmap中put元素時,首先根據(jù)key的hashcode重新計算hash值,根絕hash值得到這個元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒有元素,就直接將該元素放到數(shù)組的該位置上。
redis緩存穿透:
某些用戶通過接口去訪問數(shù)據(jù),跳過了redis緩存,因?yàn)閞edis里面沒有需要的數(shù)據(jù),接著頻繁的去訪問數(shù)據(jù)庫,這就造成了請求打向mysql,造成數(shù)據(jù)庫的宕機(jī),這就造成了緩存穿透。解決的方法就是把從數(shù)據(jù)庫返回的數(shù)據(jù)以key-value的形式存入redis,value為空,這樣之后的每次請求都給他返回null即可。
redis緩存擊穿:
就是一個用戶在同一時間內(nèi)無腦的訪問redis沒有的數(shù)據(jù),這就造成了緩存擊穿。解決的方法就是把訪問者的ip記錄下來,這樣以后在訪問的時候給他彈回去就是。
redis緩存雪崩:
就是redis中的數(shù)據(jù)過期時間同時過期,導(dǎo)致用戶的大量請求在redis中沒有找到數(shù)據(jù),就走了數(shù)據(jù)庫,這樣就造成了緩存雪崩。解決的方法就是在redis的數(shù)據(jù)里面的過期原本的過期時間的基礎(chǔ)上在加上一個隨機(jī)的時間,讓數(shù)據(jù)不同時消失,另外如果用戶頻繁的去訪問同一個數(shù)據(jù)的時候,這時候我們就可以把它定義成一個熱點(diǎn)數(shù)據(jù),把他的過期時間改成永久。
springcloud組件:
1、eureka 服務(wù)注冊中心
2、zuul 服務(wù)網(wǎng)關(guān)
3、ribbon 負(fù)載均衡
4、config 配置中心
5、hystrix 熔斷器 默認(rèn)的閥值默認(rèn)線程數(shù)是多少 3000ms
rabbitmq 怎么保證消息的穩(wěn)定性?
1、提供了事務(wù)的功能。
2、通過將 channel 設(shè)置為 confirm(確認(rèn))模式。
rabbitmq 怎么避免消息丟失?
1、消息持久化
2、ACK確認(rèn)機(jī)制
3、設(shè)置集群鏡像模式
4、消息補(bǔ)償機(jī)制
mysql索引:
索引存在的好處是加快我們查詢數(shù)據(jù)庫的速度,避免出現(xiàn)全面檢索。
索引是滿足某種特定查找算法的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)會以某種方式指向數(shù)據(jù),從而實(shí)現(xiàn)高效查找數(shù)據(jù)。目前的索引都是B+數(shù)實(shí)現(xiàn)的,B+樹的搜索效率可以到達(dá)二分法的性能,找到數(shù)據(jù)區(qū)域之后就找到了完整的數(shù)據(jù)結(jié)構(gòu),所以索引的性能也是更好的。
但是建立索引不要建立在經(jīng)常修改的字段上面。
mysql的行鎖和表鎖
MyISAM只支持表鎖,InnoDB支持表鎖和行鎖,默認(rèn)為行鎖。
表級鎖:開銷小,加鎖快,不會出現(xiàn)死鎖。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)量最低。
行級鎖:開銷大,加鎖慢,會出現(xiàn)死鎖。鎖力度小,發(fā)生鎖沖突的概率小,并發(fā)度最高。
數(shù)據(jù)庫的樂觀鎖需要自己實(shí)現(xiàn),在表里面添加一個 version 字段,每次修改成功值加 1,這樣每次修改的時候先對比一下,自己擁有的 version 和數(shù)據(jù)庫現(xiàn)在的 version 是否一致,如果不一致就不修改,這樣就實(shí)現(xiàn)了樂觀鎖。
mysql 問題排查都有哪些手段?
1、使用 show processlist 命令查看當(dāng)前所有連接信息。
2、使用 explain 命令查詢 SQL 語句執(zhí)行計劃。
3、開啟慢查詢?nèi)罩?,查看慢查詢?SQL。
synchronized 和 Lock 有什么區(qū)別?
1、首先synchronized是java內(nèi)置關(guān)鍵字,在jvm層面,Lock是個java類;
2、synchronized無法判斷是否獲取鎖的狀態(tài),Lock可以判斷是否獲取到鎖;
3、synchronized會自動釋放鎖(a 線程執(zhí)行完同步代碼會釋放鎖 ;b 線程執(zhí)行過程中發(fā)生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;
4、用synchronized關(guān)鍵字的兩個線程1和線程2,如果當(dāng)前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下5、去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結(jié)束了;
6、synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可);
7、Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。