心之所向,勇往直前!
記錄面試中的那些小事。面試題只是一道門,最好還是走進屋里看看。
正文
你是如何保證系統是高可用的(結合自己項目講解最好,不一定需要行業內很復雜的方案)參考資料
高可用就是減少程序停機的可能性,常用做法是負載均衡 + 集群。
a. nginx負載均衡 + 前后端分離 + Api微服務 + 集群
b. Redis可以啟用哨兵模式或者cluster
c. MQ集群
d. 數據庫主從
什么情況下會產生死鎖
當兩個進程同時競爭相同資源時,如在A中獲取1號資源后加鎖再獲取2號資源,同時B先獲取2號資源加鎖,再去獲取1號資源,兩者會進入死鎖狀態。
a. 互斥條件:進程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一進程所占用
b. 請求和保持條件:當進程因請求資源而阻塞時,對已獲得的資源保持不放
c. 占有申請條件:進程自己已經至少保持一個資源,又請求其他資源,但是這個資源被其他進程占有,而且又不釋放自己已經占有的資源
d. 循環等待條件:發生死鎖時,必定會形成一個進程——資源的環路。
如何避免死鎖的發生?參考資料
a. 盡量讓事務按順序執行。
b. 將大事務拆成多個小事務執行
c. 讀寫分離
d. 避免編寫需要用戶交互的事務
什么是樂觀鎖、悲觀鎖?參考資料
樂觀鎖:假設數據一般情況不會造成沖突,通過給數據添加Version列來實現並發控制
悲觀鎖:數據庫鎖,具有極強的獨占、排他性。比較少用。
- 共享鎖:也稱讀鎖,多個事務中只能讀不能改
- 排他鎖:也稱寫鎖,獲取到鎖的事務擁有讀和寫的權限,其他事務不能再獲取資源的一切鎖
什么是臟讀、幻讀、不可重復讀,如何避免?參考資料
臟讀:指一個事務中訪問到了另外一個事務未提交的數據,當事務A出現回滾時,事務B的讀取到的將是臟數據(被事務A修改過的)
幻讀:指一個事務中兩次相同的查詢,得到的數據量不一致
不可重復讀:指一個事務兩次相同的查詢,得到的結果不一致
你都了解哪些ORM?
Entity Framework,Dapper,NHibernate
你都了解哪些MQ?參考資料
a. ActiveMQ
b. RocketMQ
c. RabbitMQ
d. Kafka
一般什么業務場景下會使用MQ
使用MQ是為了解耦、異步、消峰。
a. 系統只能承受2000人並發,但出秒殺活動時出現5000並發,此時使用隊列可讓多余的請求等待。
b. 有多個系統需要同時獲取相同數據的時候
如何保證MQ的冪等性(不會重復消費)
a. 在寫庫時先查詢一次是否已經存在,存在則Update
b. 如果是Set到Redis中具有天然冪等性
c. 主鍵唯一
如何保證MQ的可靠性(不會丟失數據) 參考資料
a. 生產階段:要捕獲消息發送錯誤,並重發消息
b. 儲存階段:數據持久化,集群
c. 消費階段:確認業務邏輯都完成后再發送確認消息
MQ消息積壓如何處理
a. 部分業務可以采取限流操作,減少消息的產生
b. 對Broker進行擴容處理
c. 增加消費端
你都了解哪些數據庫?
a. Access:基於Windows的關系型小型數據庫。數據量大會出現性能問題
b. Sqlite:開源、輕量級嵌入式數據庫、簡單配置、無需安裝
- 不支持高並發
- 適用數據量小
c. MySql: 關系型、體積小、查詢速度快,支持上千萬數據量查詢
- 不是完全開源免費
d. Sqlserver:功能全面,商業型數據庫,Windows Server部署時優先選用
e. Oracle:功能全面,商業型數據庫,大型項目/Linux部署優先選用
f. MongoDB:開源、文檔型NoSql數據庫,查詢性能極高,有豐富的社區支持
- 不支持事務
- 占用磁盤
知道數據庫索引類型有哪些嗎?
a. 聚集索引:聚集索引全表只能有一個,比如主鍵
b. 非聚集索引:可以有多個
使用索引的優缺點
a. 優點:提升查詢速度
b. 缺點:增加維護成本,降低增、刪、改速度
你了解過哪些緩存技術?
a. Redis
- 單線程
- 支持多種數據類型:list、set、hash、string、zset
- 支持持久化RDB和AOF兩種模式
- 支持事務
b. Memcached
- 多線程
- 支持Key-Value型
- 不支持持久化,可靠性低
- 通過cas命令保證數據一致性
結語
本篇到此結束,如果有任何疑問或者指正,請發表在評論區。