欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

(高頻問題)241-260 計算機 Java后端 實習 and 秋招 面試高頻問題匯總

專欄簡介

241. 基于Binlog的MySQL到Redis數(shù)據(jù)同步方案

Binlog(Binary Log)是MySQL數(shù)據(jù)庫中用于記錄所有數(shù)據(jù)變更操作的二進制日志文件。通過解析Binlog,可以將數(shù)據(jù)庫的變更實時或定期地同步至Redis,這種方法常用于將數(shù)據(jù)庫的更新操作實時反映到Redis緩存中,以保障數(shù)據(jù)的一致性與實時性。

實現(xiàn)基于Binlog的數(shù)據(jù)同步,首先需要確保MySQL數(shù)據(jù)庫已啟用Binlog功能,這通常涉及在MySQL配置文件中進行相應設置。其次,選擇合適的同步工具至關重要。例如,阿里巴巴開源的Canal是一款廣泛應用的工具,它能夠解析MySQL Binlog并將數(shù)據(jù)變更同步到Redis等目標。Canal的名稱寓意其在不同數(shù)據(jù)存儲系統(tǒng)間構建數(shù)據(jù)傳輸通道。其他可選工具包括輕量級的MySQL Binlog監(jiān)聽器Maxwell,以及基于Kafka的CDC(Change Data Capture)工具Debezium。選定工具后,需配置其與MySQL和Redis的連接參數(shù),并定義需要同步的表和列。啟動同步工具后,它會監(jiān)聽MySQL的Binlog變更,并將這些變更數(shù)據(jù)寫入Redis。數(shù)據(jù)在Redis中通常會根據(jù)其特性存儲為字符串、哈希、列表或集合等適宜的數(shù)據(jù)結構。

242. Redis RDB持久化機制與執(zhí)行流程

當觸發(fā)Redis數(shù)據(jù)庫的RDB(Redis Database Backup)快照機制時,Redis會將當前內存中的所有數(shù)據(jù)以二進制格式寫入一個臨時的RDB文件。

具體的執(zhí)行方式根據(jù)觸發(fā)命令有所不同:若通過SAVE命令手動觸發(fā),Redis主進程將被阻塞,直至快照操作完成,期間無法處理其他客戶端請求。而若使用BGSAVE命令,Redis會派生(fork)一個子進程來負責快照的生成,主進程則能繼續(xù)處理客戶端請求,基本不受影響。子進程完成快照后,會將生成的臨時文件原子性地重命名為預設的RDB文件名(默認為dump.rdb),從而替換舊的RDB文件。

243. MySQL InnoDB數(shù)據(jù)頁結構及其行存儲能力分析

MySQL InnoDB存儲引擎以頁(Page)作為數(shù)據(jù)存儲的基本單元,其默認大小通常為16KB,盡管此大小可通過配置調整。頁的內部結構對數(shù)據(jù)庫性能和存儲效率有顯著影響。一個InnoDB頁主要由文件頭部、頁頭部、Infimum和Supremum記錄、**用戶記錄(User Records)**區(qū)域(實際存儲用戶數(shù)據(jù)行)、空閑空間、頁目錄以及文件尾部等部分構成,各有其特定功能,例如文件頭部記錄頁類型和編號,頁頭部記錄頁的元數(shù)據(jù),頁目錄則用于加速頁內記錄查找。

一個頁能存儲的最大行數(shù)主要取決于行記錄的實際大小、頁本身的大小以及每條記錄的額外開銷(如記錄頭信息和隱藏列)。理論上,若InnoDB頁大小為16KB(即16384字節(jié)),且不考慮頁內其他結構的固定開銷,僅考慮每條記錄自身的數(shù)據(jù)和元數(shù)據(jù),假設一條用戶記錄的數(shù)據(jù)部分大小為N字節(jié),而記錄頭等固定開銷為M字節(jié)(例如,InnoDB中行記錄通常有約20-30字節(jié)的額外開銷),則最大行數(shù)約等于 16384 / (N + M)。例如,若一條記錄的數(shù)據(jù)部分為100字節(jié),額外開銷為26字節(jié),則一個頁理論上最多可存儲約 16384 / (100 + 26) ≈ 130 行。然而,由于頁頭部、尾部、頁目錄、Infimum/Supremum記錄以及為保證后續(xù)插入效率而可能預留的空閑空間等因素,實際存儲的行數(shù)通常會少于此理論最大值。

244. MySQL InnoDB中MVCC的實現(xiàn)機制與工作原理

多版本并發(fā)控制(MVCC, Multi-Version Concurrency Control)是InnoDB存儲引擎用以提升并發(fā)性能、實現(xiàn)不同事務隔離級別(如讀已提交和可重復讀)的關鍵技術。它通過為每行記錄保存多個歷史版本來實現(xiàn)事務間的隔離讀取,從而避免了傳統(tǒng)鎖定機制下讀寫操作間的長時間阻塞。

MVCC的實現(xiàn)依賴以下核心要素:InnoDB會為每行記錄添加一些隱藏列,其中最關鍵的是事務ID(DB_TRX_ID,用于標記最后修改該行的事務;以及回滾指針(DB_ROLL_PTR,它指向存儲在Undo日志中的該行記錄的前一個版本。當數(shù)據(jù)被修改時,舊版本數(shù)據(jù)連同其必要信息會被記錄到Undo日志中,而當前行記錄的DB_TRX_ID更新為當前事務ID,DB_ROLL_PTR指向Undo日志中的舊版本。此外,每個事務(或在某些隔離級別下,每個語句)開始時會創(chuàng)建或獲取一個一致性讀視圖(Read View),該視圖記錄了在它創(chuàng)建時刻系統(tǒng)中所有活躍(未提交)事務的列表,用于判斷哪些行版本對當前事務可見。

在讀取數(shù)據(jù)時,InnoDB會根據(jù)行記錄的DB_TRX_ID和當前事務的Read View來決定可見性。例如,在可重復讀(Repeatable Read)隔離級別下,事務基于其啟動時創(chuàng)建的Read View進行判斷:如果記錄的DB_TRX_ID代表的事務不在Read View的活躍事務列表中且早于Read View的創(chuàng)建,則該版本可見;否則,InnoDB會沿著DB_ROLL_PTR回溯Undo日志,查找更早的、對當前事務可見的版本。在讀已提交(Read Committed)隔離級別下,通常每次SELECT語句執(zhí)行前都會獲取一個新的Read View。寫入數(shù)據(jù)(插入、更新、刪除)時,InnoDB會創(chuàng)建新版本的行記錄(或標記刪除),并正確設置其DB_TRX_IDDB_ROLL_PTR。事務的提交使其修改對其他后續(xù)開啟新Read View的事務可見,而回滾操作則利用Undo日志來撤銷未提交的修改。

245. DAU (日活躍用戶) 與 DAC (日活躍客戶) 的核心差異

DAU(Daily Active Users,日活躍用戶)與DAC(Daily Active Customers,日活躍客戶)是衡量用戶活躍度的兩個相關但有顯著區(qū)別的指標,其核心差異在于所關注的用戶群體屬性和行為層面。

DAU指的是每日登錄或與產品、應用發(fā)生有效交互的獨立用戶數(shù)量。該指標廣泛應用于評估各類互聯(lián)網產品(如社交媒體、游戲、內容平臺、工具應用等)的用戶參與度和整體用戶群的活躍程度。例如,若某款應用在一天內有5000名不同的用戶至少打開并進行了一次有效操作,則其當日DAU為5000。DAU主要反映產品的吸引力和用戶粘性。

DAC則特指每日在平臺上實際完成特定商業(yè)價值行為(通常是付費行為,如購買商品、訂閱服務、完成支付等)的獨立客戶數(shù)量。此指標更側重于衡量用戶的商業(yè)價值貢獻和平臺的營收轉化能力,對于電商平臺、在線教育、SaaS服務等以交易或付費訂閱為核心商業(yè)模式的業(yè)務尤為關鍵。例如,若某電商平臺一天內有300名獨立用戶完成了至少一筆購買訂單,則其當日DAC為300。DAC直接關聯(lián)到平臺的變現(xiàn)效率。

因此,主要差異可以理解為:DAU衡量的是廣義上的用戶“活躍度”,而DAC衡量的是具有直接“商業(yè)貢獻”的客戶“活躍度”。

246. Kafka因哈希取模導致的分區(qū)不均衡問題及其解決策略

Kafka在進行數(shù)據(jù)分區(qū)時,采用哈希取模是實現(xiàn)消息順序性的常見方式,但這確實可能引發(fā)分區(qū)數(shù)據(jù)不均衡的問題。具體而言,這種不均衡現(xiàn)象主要源于以下幾點:

其一,哈希函數(shù)設計缺陷是重要原因。若哈希函數(shù)未能實現(xiàn)均勻分布,某些消息鍵經過哈希運算后可能更傾向于映射到特定的少數(shù)分區(qū),導致這些分區(qū)數(shù)據(jù)量過大,而其他分區(qū)數(shù)據(jù)稀疏。

其二,消息鍵分布不均也會導致問題。即便哈希函數(shù)本身設計優(yōu)良,如果業(yè)務數(shù)據(jù)中的某些消息鍵出現(xiàn)頻率遠高于其他鍵,這些高頻鍵產生的大量消息依然會集中到少數(shù)分區(qū)。

此外,當分區(qū)數(shù)量與消息鍵的多樣性不匹配時,例如鍵的種類遠多于分區(qū)數(shù),也可能在一定程度上加劇數(shù)據(jù)傾斜。

針對Kafka分區(qū)不均衡的問題,可以從以下幾個方面著手解決:

首先,考慮重新設計或優(yōu)化哈希策略??梢赃x擇一個已知具有更好分布特性的哈希算法,例如MurmurHash,以期將鍵更均勻地映射到各個分區(qū)。若消息數(shù)據(jù)包含多個屬性,可以考慮將這些屬性組合成一個復合鍵(例如,userIdtimestamp拼接),再對此復合鍵進行哈希,以增加哈希值的隨機性和分布性。有時,在得到初步哈希值后,可以對其進行二次處理,如進行二次哈希或簡單的數(shù)學變換(如乘以一個質數(shù)并取模),進一步打散哈希結果,改善分布。

其次,可以引入一致性哈希機制。這是一種高級哈希算法,尤其適用于分區(qū)數(shù)量可能動態(tài)變化的場景。它將哈希值空間組織成一個虛擬環(huán),并將分區(qū)節(jié)點和數(shù)據(jù)鍵都映射到這個環(huán)上。數(shù)據(jù)會存儲在環(huán)上順時針方向尋找到的第一個分區(qū)節(jié)點。一致性哈希的優(yōu)勢在于,當分區(qū)增加或減少時,僅影響局部的數(shù)據(jù)映射,從而最小化數(shù)據(jù)遷移和傾斜風險。為了進一步提升負載均衡效果,一致性哈希常與虛擬節(jié)點(Virtual Nodes)技術結合使用。具體做法是,每個物理分區(qū)節(jié)點在哈希環(huán)上映射為多個虛擬節(jié)點,這些虛擬節(jié)點均勻散布于環(huán)上。當數(shù)據(jù)項映射到環(huán)上后,會分配給順時針尋找到的第一個虛擬節(jié)點所對應的物理分區(qū)。通過增加虛擬節(jié)點的數(shù)量,可以使得數(shù)據(jù)在物理分區(qū)間的分布更為平滑和均衡。

247. 本地緩存實現(xiàn)中的常見并發(fā)問題與優(yōu)化方案分析

以下是對一段本地緩存Java代碼實現(xiàn)中潛在問題的分析及相應的優(yōu)化建議。

import java.util.concurrent.ConcurrentHashMap;

public class CacheManager {
    private static ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();

    public static void putValue(String key, String value) {
        cache.put(key, value);
    }

    public static String getValue(String key) {
        if (cache.containsKey(key)) { // 檢查
            return cache.get(key);    // 操作
        } else {
            return fetchDataFromDatabase(key);
        }
    }

    private static String fetchDataFromDatabase(String key) {
        String value = "Data for " + key;
        cache.put(key, value); // 回填緩存
        return value;
    }
}

在上述getValue方法中,cache.containsKey(key)cache.get(key)這兩個操作之間存在競態(tài)條件。在多線程環(huán)境下,如果多個線程幾乎同時請求一個緩存中尚不存在的相同鍵(例如"key1"),它們可能都會通過containsKey的檢查,然后都執(zhí)行fetchDataFromDatabase方法。這將導致重復的數(shù)據(jù)庫訪問和多次緩存寫入,增加了系統(tǒng)開銷,尤其是在數(shù)據(jù)庫查詢成本較高時。

為了解決這個問題,可以利用ConcurrentHashMap提供的原子操作computeIfAbsent。該方法能夠確保當鍵不存在時,只有一個線程會執(zhí)行加載數(shù)據(jù)的邏輯(例如fetchDataFromDatabase),其他線程則會等待該計算完成并獲取結果。修改后的getValue方法如下:

public static String getValue(String key) {
    return cache.computeIfAbsent(key, k -> fetchDataFromDatabase(k));
}

這里,k -> fetchDataFromDatabase(k)是一個Lambda表達式,定義了當鍵key(在Lambda中用k表示)不存在于緩存時,如何計算其值的邏輯。

此外,當前緩存實現(xiàn)還存在其他可以優(yōu)化的問題:該實現(xiàn)缺乏緩存過期策略。一旦數(shù)據(jù)存入緩存,除非被顯式移除,否則會永久存在,這可能導致內存占用持續(xù)增長??梢砸牖跁r間的過期策略(如TTL)或基于使用頻率的淘汰算法(如LRU - Least Recently Used)。Java生態(tài)中,Guava Cache或Caffeine庫提供了這些高級緩存功能。

同時,ConcurrentHashMap本身默認沒有大小限制,緩存可能會無限增長,最終可能導致OutOfMemoryError。可以通過配置最大緩存條目數(shù)來限制緩存大小。同樣,Caffeine等第三方庫也支持靈活的大小限制策略,并結合LRU等算法進行條目淘汰。

248. 高并發(fā)下多表聯(lián)合查詢的優(yōu)化策略

假設存在圖書(Books)、作者(Authors)、圖書-作者關聯(lián)表(BookAuthors)和出版社(Publishers)四張表,一個典型的聯(lián)合查詢可能如下,用于獲取特定書名的圖書信息及其作者和出版社:

SELECT
    b.title AS book_title,
    a.author_name,
    p.publisher_name
FROM
    Books b
JOIN
    BookAuthors ba ON b.book_id = ba.book_id
JOIN
    Authors a ON ba.author_id = a.author_id
JOIN
    Publishers p ON b.publisher_id = p.publisher_id
WHERE
    b.title = '某本書';

在高并發(fā)場景下,對此類多表聯(lián)合查詢進行優(yōu)化可以從應用層面和數(shù)據(jù)庫設計層面分別考慮。

應用層面優(yōu)化策略

可以引入應用層緩存,使用如Redis、Memcached等工具緩存熱點查詢結果。對于不經常變動的數(shù)據(jù),緩存能顯著減少數(shù)據(jù)庫的直接訪問壓力。對于查詢結果相對固定的場景,可以考慮生成靜態(tài)內容片段或頁面,直接服務用戶,避免動態(tài)查詢。實施數(shù)據(jù)庫讀寫分離,將寫操作路由到主庫,讀操作分散到多個從庫,利用主從復制機制分攤查詢負載。優(yōu)化數(shù)據(jù)庫連接池配置,如使用HikariCP,合理設置最大連接數(shù)和最小空閑連接數(shù),復用連接以減少開銷。使用負載均衡器(如NGINX)將請求分發(fā)到多個應用服務器實例,從而水平擴展處理能力。對于非實時性要求高的查詢,可以采用異步處理,將查詢任務放入消息隊列,由后臺服務異步執(zhí)行并通知結果。在高并發(fā)峰值時,實施請求限流策略,例如使用令牌桶算法,保護數(shù)據(jù)庫免于過載。必要時可采取服務降級措施,在高負載時暫時關閉非核心查詢功能,或返回預設的默認值/靜態(tài)數(shù)據(jù),保障核心服務穩(wěn)定??紤]將多個針對小數(shù)據(jù)的查詢合并為批量查詢,減少數(shù)據(jù)庫交互次數(shù)。

數(shù)據(jù)庫表結構與查詢設計層面優(yōu)化策略

核心在于索引優(yōu)化。針對查詢條件b.title = '某本書',應在Books表的title列上創(chuàng)建索引。若查詢經常涉及多個字段的組合條件或排序,可以創(chuàng)建聯(lián)合索引,例如在Books表的(title, publisher_id)上創(chuàng)建。對于連接操作,BookAuthors表上的book_idauthor_id列,以及Books表的publisher_id列,都應該是索引或者外鍵(外鍵通常會自動創(chuàng)建索引)。在特定情況下,可以考慮數(shù)據(jù)冗余(反規(guī)范化)。如果關聯(lián)表(如Authors, Publishers)的數(shù)據(jù)不常變動且查詢頻繁,可以將作者名、出版社名等字段冗余到Books表中,從而避免JOIN操作,但需注意數(shù)據(jù)一致性的維護成本。對于數(shù)據(jù)量極大的表,可以實施水平分區(qū)(Sharding),例如按publisher_id或圖書的某個分類ID進行分區(qū),將數(shù)據(jù)分散到不同物理存儲上,縮小單次查詢掃描范圍。

部署數(shù)據(jù)庫集群可以提升整體的數(shù)據(jù)處理能力和并發(fā)承載力。

249. 大規(guī)模無序數(shù)據(jù)集的內存外去重方法

處理40億個無法一次性載入內存的無序元素并進行去重,可以采用以下幾種常見的外部排序和內存外處理技術。

一種方法是基于哈希分區(qū)的去重。

首先,選擇一個合適的哈希函數(shù),將龐大的數(shù)據(jù)集通過哈希值對一個預設的數(shù)值(例如,分區(qū)文件的數(shù)量M)取模,將元素分散到M個不同的分區(qū)文件中。設計目標是確保每個分區(qū)文件的大小都能被單個機器的內存處理。然后,對每個獨立的分區(qū)文件進行處理。將單個分區(qū)文件讀入內存,使用內存中的數(shù)據(jù)結構(如HashSet)進行去重。最后,將所有分區(qū)文件去重后的結果合并,即得到最終的全局去重數(shù)據(jù)集。由于相同的元素必然會被哈希到同一個分區(qū)文件,因此分區(qū)內部去重后合并即可保證全局唯一性。

另一種高效的方法是利用布隆過濾器(Bloom Filter)。

首先,初始化一個大小合適的布隆過濾器。其大小需要根據(jù)元素數(shù)量和可接受的誤判率來確定。接著,逐個讀取數(shù)據(jù)集中的元素。對于每個元素,先查詢布隆過濾器判斷該元素是否可能已存在。如果布隆過濾器指示元素“可能已存在”(對于布隆過濾器而言,這意味著它確實存在或者這是一次誤判),則可以跳過該元素(如果業(yè)務允許一定的誤判,即少量重復可能被視為已存在而被錯誤丟棄)或將其放入一個待復核列表。如果指示元素“肯定不存在”,則將該元素視為唯一元素輸出,并將其添加到布隆過濾器中。這種方法的優(yōu)點是內存占用極小,處理速度快。其主要缺點是存在一定的誤判率(False Positive Rate),即一個實際不存在的元素可能被誤判為已存在。通過調整布隆過濾器的大小和哈希函數(shù)的數(shù)量可以控制誤判率。

還可以考慮使用Bitmap(位圖)

這種方法特別適用于元素是整數(shù)類型且其取值范圍相對有限的場景。

首先,根據(jù)數(shù)據(jù)中元素的最大可能值,創(chuàng)建一個足夠大的位圖,所有位初始為0。例如,若元素是32位無符號整數(shù),則需要一個2^32位的位圖。然后,遍歷所有元素。對于每一個元素值 x,將位圖中第 x 位置設為1。遍歷完成后,位圖中所有值為1的位置索引即代表了數(shù)據(jù)集中所有唯一的元素。例如,若元素集合為 [3, 7, 11, 3, 15],且位圖長度足以覆蓋到15。處理元素3時,位圖第3位置1;處理元素7時,第7位置1;處理元素11時,第11位置1;再次遇到3時,第3位已是1,不變;處理元素15時,第15位置1。Bitmap的空間效率非常高,每個元素僅用1位表示。但其主要限制是,當元素取值范圍過大時,位圖本身會變得非常大,可能超出內存限制。例如,處理40億個不同的32位整數(shù),如果數(shù)值范圍也很大(比如接近2的32方),則位圖本身就需要2^32 bit / 8 = 512MB 內存,這對于“無法直接放在內存中”的原始數(shù)據(jù)來說,如果唯一值數(shù)量遠小于40億,則Bitmap仍是一種可行方案。

250. 實現(xiàn)瀏覽器訪問特定域名時顯示本地內容的技術探討

要在瀏覽器地址欄顯示的是例如www.baidu.com,但實際頁面渲染的是本地開發(fā)的博客系統(tǒng),可以通過以下幾種方式實現(xiàn),主要涉及網絡請求的劫持或重定向。

一種常見且直接的方法是修改系統(tǒng)Hosts文件。操作系統(tǒng)在進行域名解析時,會優(yōu)先查找本地的hosts文件。如果在hosts文件中找到了域名對應的IP地址,則直接使用該IP,不再向DNS服務器查詢。因此,可以通過編輯此文件(Linux/macOS下通常為/etc/hosts,Windows下為C:\Windows\System32\drivers\etc\hosts),添加一條映射規(guī)則,將目標域名(如www.baidu.com)指向本地Web服務器的IP地址(通常是127.0.0.1或本地局域網IP)。例如,在hosts文件中添加:

127.0.0.1 www.baidu.com

同時,確保本地的博客系統(tǒng)服務器(如Spring Boot應用)正在運行,并且監(jiān)聽在標準的HTTP(80)或HTTPS(443)端口。這樣,當在瀏覽器中輸入www.baidu.com時,請求實際上會被發(fā)送到本地服務器,從而加載并顯示博客內容,而瀏覽器地址欄依然顯示www.baidu.com

另一種方式是利用瀏覽器插件進行地址欄偽裝或請求攔截??梢蚤_發(fā)一個瀏覽器插件(擴展程序),利用其提供的API(如Chrome的chrome.webRequest API)來攔截網絡請求。當插件檢測到用戶嘗試訪問特定域名(如www.baidu.com)時,它可以將該請求重定向到本地博客系統(tǒng)的URL(如http://localhost:8080)。更進一步,某些插件API可能允許在保持地址欄URL不變的情況下,加載來自不同源的內容,但這通常更復雜且可能涉及安全限制。這種方法的優(yōu)點是控制更靈活,但缺點是僅對安裝了該插件的瀏覽器生效。

需要注意的是,這些方法主要用于開發(fā)、測試或特定受控環(huán)境。在公共互聯(lián)網上大規(guī)模地使用類似技術偽裝知名網站,可能會涉及安全和法律問題。

251. ThreadLocal的適用場景及引發(fā)內存問題的潛在風險

ThreadLocal 主要用于在多線程環(huán)境下為每個線程提供獨立的變量副本,從而解決線程安全問題或簡化參數(shù)傳遞。其典型的應用場景包括:

為每個線程創(chuàng)建非線程安全對象的獨立副本。例如,SimpleDateFormat 類不是線程安全的,如果在多線程環(huán)境下共享同一個實例,需要進行同步控制,否則可能出現(xiàn)錯誤。通過 ThreadLocal,可以為每個線程創(chuàng)建一個SimpleDateFormat對象,各線程使用自己的副本,互不干擾,避免了同步開銷和潛在的并發(fā)問題。

在Web應用中存儲每個請求的上下文信息,如用戶身份信息、事務ID等。當一個請求到達服務器時,可以將其相關信息存入ThreadLocal。這樣,在請求處理過程中的任何代碼(無論調用棧多深)都可以方便地獲取這些信息,而無需在方法間顯式傳遞。請求處理完畢后,務必清理ThreadLocal中的數(shù)據(jù)。

在復雜的業(yè)務流程中實現(xiàn)跨方法、跨層級的參數(shù)隱式傳。當某些參數(shù)需要在多個方法或組件間共享,但又不希望通過方法簽名顯式傳遞時,可以使用。這有助于保持方法簽名的簡潔性,但需要注意其生命周期管理,避免濫用。

剩余60%內容,訂閱專欄后可繼續(xù)查看/也可單篇購買

曾獲多國內大廠的 ssp 秋招 offer,且是Java5年的沉淀老兵(不是)。專注后端高頻面試與八股知識點,內容系統(tǒng)詳實,覆蓋約 30 萬字面試真題解析、近 400 個熱點問題(包含大量場景題),60 萬字后端核心知識(含計網、操作系統(tǒng)、數(shù)據(jù)庫、性能調優(yōu)等)。同時提供簡歷優(yōu)化、HR 問題應對、自我介紹等通用能力??紤]到歷史格式混亂、質量較低、也在本地積累了大量資料,故準備從頭重構專欄全部內容

全部評論

相關推薦

從輸入URL到頁面加載發(fā)生了什么:總體來說分為以下幾個過程:&nbsp;1.DNS解析&nbsp;2.TCP連接&nbsp;3.發(fā)送HTTP請求&nbsp;4.服務器處理請求并返回HTTP報文&nbsp;5.瀏覽器解析渲染頁面&nbsp;6.連接結束。簡述了一下各個過程的輸入輸出作用:以下是對從輸入&nbsp;URL&nbsp;到頁面加載各過程的輸入、輸出或作用的一句話描述:DNS&nbsp;解析:&nbsp;輸入:用戶在瀏覽器地址欄輸入的域名(如&nbsp;www.example.com)。輸出:對應的&nbsp;IP&nbsp;地址(如&nbsp;192.168.1.1)。作用:將易于記憶的域名轉換為計算機能夠識別和用于網絡通信的&nbsp;IP&nbsp;地址,以便瀏覽器與目標服務器建立連接。TCP&nbsp;連接:&nbsp;輸入:瀏覽器獲得的服務器...
明天不下雨了:參考一下我的說法: 關鍵要講出輸入網址后涉及的每一個網絡協(xié)議的工作原理和作用: 涉及到的網絡協(xié)議: HTTP/HTTPS協(xié)議->DNS協(xié)議->TCP協(xié)議->IP協(xié)議->ARP協(xié)議 面試參考回答: 第一次訪問(本地沒有緩存時): 一般我們在瀏覽器地址欄輸入的是一個域名。 瀏覽器會先解析 URL、解析出域名、資源路徑、端口等信息、然后構造 HTTP 請求報文。瀏覽器新開一個網絡線程發(fā)起HTTP請求(應用層) 接著進行域名解析、將域名解析為 IP 地址 瀏覽器會先檢查本地緩存(包括瀏覽器 DNS 緩存、操作系統(tǒng)緩存等)是否已解析過該域名 如果沒有、則向本地 DNS 服務器請求解析; 本地服務器查不到會向更上層的 DNS 服務器(根域名服務器->頂級域名服務器->權威域名服務器詢問)遞歸查詢 最終返回該域名對應的 IP 地址。(應用層DNS協(xié)議)DNS 協(xié)議的作用: 將域名轉換為 IP 地址。 由于 HTTP 是基于 TCP 傳輸?shù)?、所以在發(fā)送 HTTP 請求前、需要進行三次握手、在客戶端發(fā)送第一次握手的時候、( 瀏覽器向服務器發(fā)送一個SYN(同步)報文、其中包含客戶端的初始序列號。TCP頭部設置SYN標志位、并指定客戶端端口 同時填上目標端口和源端口的信息。源端口是瀏覽器隨機生成的、目標端口要看是 HTTP 還是 HTTPS、如果是 HTTP 默認目標端口是 80、如果是 HTTPS 默認是 443。(傳輸層) 然后到網絡層:涉及到(IP協(xié)議) 會將TCP報文封裝成IP數(shù)據(jù)包、添加IP頭部,包含源IP地址(瀏覽器)和目標IP地址(服務器)。IP 協(xié)議的作用: 提供無連接的、不可靠的數(shù)據(jù)包傳輸服務。 然后到數(shù)據(jù)鏈路層、會通過 ARP 協(xié)議、獲取目標的路由器的 MAC 地址、然后會加上 MAC 頭、填上目標 MAC 地址和源 MAC 地址。 然后到物理層之后、直接把數(shù)據(jù)包、轉發(fā)給路由器、路由器再通過下一跳、最終找到目標服務器、然后目標服務器收到客戶的 SYN 報文后,會響應第二次握手。 當雙方都完成三次握手后、如果是 HTTP 協(xié)議、客戶端就會將 HTTP 請求就會發(fā)送給目標服務器。如果是 HTTPS 協(xié)議、客戶端還要和服務端進行 TLS 四次握手之后、客戶端才會將 HTTP 報文發(fā)送給目標服務器。 目標服務器收到 HTTP 請求消息后、就返回 HTTP 響應消息、瀏覽器會對響應消息進行解析渲染、呈現(xiàn)給用戶
點贊 評論 收藏
分享
評論
3
2
分享

創(chuàng)作者周榜

更多
??途W
??推髽I(yè)服務