1,假若有兩個線程,一個線程A,一個線程B都會訪問一個加鎖方法,可能存在併發狀況,可是線程B訪問頻繁,線程A訪問次數不多,問如何優化。(而後面試官說有了解太重度鎖和輕度鎖嗎)html
a,競爭資源不激烈,選擇Synchronized:nginx
在資源競爭不是很激烈的狀況下,Synchronized的性能要優於ReetrantLock,web
可是在資源競爭很激烈的狀況下,Synchronized的性能會降低幾十倍,可是ReetrantLock的性能能維持常態;面試
b,優化,假設線程A和B不會併發訪問,若是發生了併發,再膨脹爲重量級鎖:ajax
輕量級鎖的核心思想就是「被加鎖的代碼不會發生併發,若是發生併發,那就膨脹成重量級鎖。算法
2.瞭解面向服務框架SOA,微服務嗎?
面向服務的架構(SOA)是一個組件模型,它將應用程序的
不一樣功能單元(稱爲服務)經過這些
服務之間定義良好的接口和契約聯繫起來。
接口是採用中立的方式 進行定義的,它應該獨立於實現服務的硬件平臺、操做系統和編程語言。這使得構建在各類各樣的系統中的服務能夠以一種統一和通用的方式進行交互。
微服務:
完全的組件化和服務化,Docker容器,進程隔離;
微服務的目的是有效的拆分應用,實現敏捷開發和部署 。
3.分佈式系統如何負載均衡?如何肯定訪問的資源在哪一個服務器上?
一.輪詢。二.隨機。三.最小響應時間。四. 最小併發數。五.一致性哈希。
http://tech.youzan.com/load-balancing-algorithm/sql
4.設計一個分佈式負載均衡緩衝系統,如何快速定位到是那個服務器數據庫
(使用key分段、一致性hash:http://blog.csdn.net/sparkliang/article/details/5279393 )編程
5.如何保證緩衝區和數據庫之間的強一致性(使用加鎖)
事務,鎖,
「先淘汰緩存,再修改數據庫」
「先操做緩存,在寫數據庫成功以前,若是有讀請求發生,可能致使舊數據入緩存,引起數據不一致」
寫流程:
(1)先淘汰cache
(2)再寫db
讀流程:
(1)先讀cache,若是數據命中hit則返回
(2)若是數據未命中miss則讀db
(3)將db中讀取出來的數據入緩存
其實不須要讓全局的請求串行化,而只須要「讓同一個數據的訪問能串行化」就行。
在一個服務內,如何作到「讓同一個數據的訪問串行化」,只須要「讓同一個數據的訪問經過同一條DB鏈接執行」就行。
如何作到「讓同一個數據的訪問經過同一條DB鏈接執行」,只須要「在DB鏈接池層面稍微修改,按數據取鏈接便可」
獲取DB鏈接的CPool.GetDBConnection()【返回任何一個可用DB鏈接】改成
CPool.GetDBConnection(longid)
【返回id取模相關聯的DB鏈接】
可否作到同一個數據的訪問落在同一個服務上?
能夠,一樣是用id去區分。
因爲數據庫層面的讀寫併發,引起的數據庫與緩存數據不一致的問題(本質是後發生的讀請求先返回了),可能經過兩個小的改動解決:
(1)修改服務Service鏈接池,id取模選取服務鏈接,可以保證同一個數據的讀寫都落在同一個後端服務上
(2)修改數據庫DB鏈接池,id取模選取DB鏈接,可以保證同一個數據的讀寫在數據庫層面是串行的
6.HashMap高併發狀況下會出現什麼問題後端
高併發場景下HashMap在擴容時可能會造成閉環,致使死循環。
http://www.iteye.com/topic/962172
7,ConcurrentHashMap如何擴容,內部結構?
如何擴容?
擴容的時候首先會建立一個兩倍於原容量的數組,而後將原數組裏的元素進行再hash後插入到新的數組裏。
爲了高效ConcurrentHashMap不會對整個容器進行擴容,而只對某個segment進行擴容
http://www.infoq.com/cn/articles/ConcurrentHashMap
8.對於SQL慢查詢的優化?
(主要是從查詢語句和數據庫表設計兩個方面來考慮,查詢語句方面能夠增長索引,增長查詢篩選的限制條件;數據庫表設計的時候能夠拆分表,設計得更細粒度。可是後來才發現面試官想要的就是查詢大量數據的慢查詢問題的優化。。。)
先使用explain等找到耗時的地方,而後針對性的優化。SQL語句的優化。應該是須要針對業務數據進行一些特殊的優化。好比數據分類等。若是沒法改變數據庫設計,那就只能優化SQL語句,改變數據庫參數設置了。
數據庫SQL優化大總結之 百萬級數據庫優化方案:
http://database.51cto.com/art/201407/445934.htm
9,用過哪些容器?(tomcat)對比過Tomcat與其餘服務器的區別嗎?好比nginx?
nginx經常使用作靜態內容服務和代理服務器,Tomcat可以
動態的生成資源並返回到客戶端。
Nginx 應該叫作「HTTP Server」;而 Tomcat 則是一個「Application Server」,或者更準確的來講,是一個「Servlet/JSP」應用的容器;
雖然Tomcat也能夠認爲是HTTP服務器,但一般它仍然會和Nginx配合在一塊兒使用:
- 動靜態資源分離——運用Nginx的反向代理功能分發請求:全部動態資源的請求交給Tomcat,而靜態資源的請求(例如圖片、視頻、CSS、JavaScript文件等)則直接由Nginx返回到瀏覽器,這樣能大大減輕Tomcat的壓力。
- 負載均衡,當業務壓力增大時,可能一個Tomcat的實例不足以處理,那麼這時能夠啓動多個Tomcat實例進行水平擴展,而Nginx的負載均衡功能能夠把請求經過算法分發到各個不一樣的實例進行處理。
10,HashMap的內部實現
在分析jdk1.8後的HashMap源碼時,HashMap的數據結構(數組+鏈表+紅黑樹),桶中的結構多是鏈表,也多是紅黑樹,紅黑樹的引入是爲了提升效率。
HashMap數據結構:
http://www.cnblogs.com/huaizuo/p/5371099.html
11,ConcurrentHashMap內部是如何實現的?每一個segment是個什麼數據結構?
ConcurrentHashMap內部是由多個segment組成,每一個segment是一個HashEntry數組,每一個HashEntry是鏈表。
實現同步的方法是segment繼承了ReentrantLock類;
Hashtable實現線程安全的方法是使用synchronized。
12.tomcat均衡方式 ,netty
Netty是什麼?
本質:JBoss作的一個Jar包
目的:快速開發高性能、高可靠性的網絡服務器和客戶端程序
優勢:提供異步的、事件驅動的網絡應用程序框架和工具
通俗的說:一個好使的處理Socket的東東
http://lippeng.iteye.com/blog/1907279
http://blog.csdn.net/kobejayandy/article/details/11493717
13,有一些爬蟲IP不斷的訪問美團網站,如今美團設定一個IP5分鐘以內訪問美團網站超過100次,就斷定爲爬蟲IP,怎麼設計這個程序?若是100改爲10000,怎麼設計?
讀取log中的IP記錄,並統計每一個IP的訪問次數,以5分鐘爲分隔,超過100的IP就是爬蟲IP,沒有超過的在5分鐘的時候清零,繼續統計。
14.負載均衡如何實現Seesion共享
(1)咱們能夠把用戶訪問頁面產生的session放到cookie裏面,就是以cookie爲中轉站。
(2)
會話保持:Session保持是咱們見到最多的名詞之一,經過會話保持,負載均衡進行
請求分發的時候保證每一個客戶端固定的訪問到
後端的同一臺應用服務器。會話保持方案在全部的負載均衡都有對應的實現。並且這是在負載均衡這一層就能夠解決Session問題。
(3)會話複製:將每一個應用服務器中的Session信息複製到其它服務器節點上。(不可取)
(4)
會話共享:對於Session來講,確定是頻繁使用的,雖然你能夠把它存放在數據庫中,可是真正生產環境中我更推薦存放在性能更快的
分佈式KV數據中,例如:Memcached和Redis。
15.對後臺的優化有了解嗎?好比負載均衡。
Nginx+Tomcat負載均衡: http://blog.csdn.net/wang379275614/article/details/47778201
異步處理(消息緩衝服務器): http://blog.csdn.net/shaobingj126/article/details/50585035
緩存(Redis,Memcache),NoSQL,數據庫優化,存儲索引優化。
16.DNS均衡
智能DNS能夠經過多種負載均衡策略來將客戶端須要訪問的域名解析到不一樣的數據中心不一樣的線路上,好比經過IP地理信息數據庫解析到最近的線路,或者權衡不一樣線路的繁忙度解析到空閒的線路等等。
將客戶端的訪問引導到不一樣的機器上去,使得不一樣的客戶端訪問不一樣的服務器,從而達到負載均衡的目的。
1.全局的運營商+區域層面的負載均衡,主要是就近調度原則;
2.機房或集羣內部的負載均衡,主要實現流量均攤、合理利用資源等;
負載均衡之DNS域名解析 : http://blog.csdn.net/cywosp/article/details/38017027
17.nginx事件處理模型
異步、事件循環;
nginx事件驅動:通訊機制採用epoll模型,支持更大的併發鏈接。
經過異步非阻塞的事件處理機制,Nginx實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級。
傳統web服務器的瓶頸緣由:進程切換佔用過多資源+進程睡眠浪費資源
nginx解決之道:單個進程+多階段異步處理
http://blog.csdn.net/u013009575/article/details/17471615
18.介紹三級緩存原理
內存 > 硬盤 > 網絡
19.int i=0; Integer i1=0; Integer i2=new Integer(0); Integer i3=new Integer(0);
System.out.println(i==i1);//true 指向堆中的基本類型時,直接取到其值。
System.out.println(i==i1);//true指向堆中的基本類型時,直接取到其值。
System.out.println(i1==i2);//false指向堆中的 對象 類型時,直接取到其地址。
System.out.println(i3==i2);//false指向堆中的 對象 類型時,直接取到其地址。
System.out.println(i3.equals(i2));//true指向堆中的 對象 類型時,equals取到其值。
20.輸出用戶表裏重名的用戶,說sql語句
select myname, count(*) from tab group by myname having count(*) > 1
21.說一下ajax
是指一種建立交互式
網頁應用的網頁開發技術。經過在後臺與服務器進行少許數據交換,AJAX 可使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。
優勢:由於是異步的,因此不會阻塞用戶操做;
局部刷新,這樣就可以使網頁從服務器請求少許的信息,而不是整個頁;