心之所向,勇往直前!
記錄面試中的那些小事。
正文
請解釋什麼是強類型、弱類型
強類型:指定明確的數據類型,如: int a = 1
弱類型:沒有指定明確的數據類型,會在程序運行的時候解析數據類型,如: var a = 1
你是如何保證系統是高可用的(結合自己項目講解最好,不一定需要行業內很複雜的方案)參考資料
高可用就是減少程序停機的可能性,常用做法是負載均衡 + 集羣。
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命令保證數據一致性
結語
本篇到此結束,如果有任何疑問或者指正,請發表在評論區。