java面試題整理(1)

一、請你談談對MQ的理解?以及你們在項目中是怎麼用的?

答:MQ(消息隊列)是一種應用程序對應用程序的通信方法,由於在高併發環境下,由於來不及同步處理,請求往往發生堵塞,通過消息隊列,我們可以異步處理請求,緩解系統壓力;MQ( Message Queue) ,即消息隊列是在消息的傳輸過程中保存消息的容器。
通俗的說, 就是一個容器, 你把消息丟進去, 不需要立即處理。 然後有個程序去從你的容器裏面把消息一條條讀出來處理。一般用於應用系統解耦、消息異步分發, 能夠提高系統吞吐量。

消息隊列
註冊用戶,發郵件(異步)
登錄,發短信通知(異步),加積分(異步)
商品添加,異步更新solr,異步更新靜態頁面
靜態頁面—庫存—實時性較差
接口,庫存修改後,重新生成新的靜態頁面

二、請你談談對Redis的認識?
答:Redis是一種基於鍵值對的NoSQL數據庫(非關係型數據庫);是一個key-value存儲系統
Redis有兩個特點:高能性 可靠性
高能性:Redis將所有數據都存儲在內存中,所以讀寫性特別高
可靠性:Redis將內存中的數據利用RDB和AOF的形式保存到硬盤中,這樣就可以避免發生斷點或機器故障時內存數據丟失的問題
功能應用
1.數據緩存功能,減少對數據庫的訪問壓力
2.消息隊列功能(輕量級)
Redis提供了發佈訂閱功能和阻塞隊列功能
3.計數器-應用保存用戶憑證
比如計算瀏覽數,如果每次操作都要做數據庫的對應更新操作,那將會給數據庫的性能帶來極大的挑戰
緩存:優化網站性能,首頁 (不常變的信息)
存儲:單點登陸,購物車
計數器:登陸次數限制,incr
時效性:驗證碼expire
訂單號:數字

三、redis應用場景
答:
1.緩存數據服務器
SSO單點登錄
2.應對高速讀寫的場景
秒殺高可用
3.分佈式鎖
秒殺數據一致性
4.數據共享
庫存數據

四、請你談談單點登錄的實現方案?你們怎麼包括cookie的安全性?跨域取cookie的問題,你們怎麼解決的?
答:單點登錄使用了Redis+Cookie實現
把用戶信息放在Redis中,Key作爲用戶憑證存放在Cookie中放在客戶端,通過獲取Cookie憑證判斷用戶是否有登錄
Cookie的安全性,我們的憑證是唯一的UUID,使用工具類統一字符串命名,並且設置了Cookie,關閉document.cookie的取值功能
Cookie的跨域問題,在二級域名使用共享Cookie的將多個系統的域名統一作爲二級域名,統一平臺提供使用主域名,cookie.setPath("/")設置Cookie路徑爲根路徑,通過cookie.setDomain(".父域名")使得項目之間跨域互相訪問他們的Cookie

五、如何應對高併發問題?
答:1.HTML靜態化,消耗最小的純靜態化的html頁面避免大量的數據庫訪問請求
2.分離圖片服務器,對於web服務器來說,圖片是最消耗資源的將圖片資源和頁面資源進行分離,進行不同的配置優化,保證更好的系統消耗和執行效率
3.數據庫集羣和庫表散列,數據庫集羣由於在架構、成本、擴張性方面都會受到所採用的關係型的限制,在應用程序安裝業務和功能模塊將數據庫進行分離,不同的模塊對應不同的數據庫或者表,再進行更小的數據庫散列,最終可以再配置讓系統隨時增加數據庫補充系統性能;
4.緩存,使用外加的redis模塊進行緩存,減輕數據庫訪問壓力
5.負載均衡,在服務器集羣中需一臺服務器調度角色Nginx,用戶所有請求先由它接收,在分配某臺服務器去處理;實現負載均衡:http重定向實現,DNS匹配,反向代理
6.動靜態分離,對於動態請求交給Tomcat而其他靜態請求,搭建專門的靜態資源服務器,使用nginx進行請求分發

六、Zookeeper應用場景
答:1.統一配置管理
持久化節點存放配置信息,監聽內容修改
2.集羣管理
臨時節點機器(節點)退出或者加入,Master選舉投票
臨時順序節點選舉時候直接使用編號最小的即可
3.分佈式鎖
創建臨時節點,創建成功者獲得鎖,執行業務操作,獨佔操作
也可以進行順序執行,通過順序臨時節點的編號
4.命名服務
/dubbo
/provider:存放服務地址
/consumer:存放消費地址(沒實際意義),
/conf:存放配置信息

consumer通過監聽provider節點的內容修改實現動態讀取地址,並且支持集羣,只需要在provider中存放多個地址然後程序中通過代碼實現隨機調用即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章