原创 【TCP/IP】Nagle 算法以及所謂 TCP 粘包

一、Nagle 算法 我們以 SSH 協議舉例,通常在 SSH 連接中,單次擊鍵就會引發數據流的傳輸。如果使用 IPv4,一次按鍵會生成約 88 字節大小的 TCP/IPv4 包(使用安全加密和認證):20 字節的 IP 頭部,20 字節的

原创 【Zookeeper】Zookeeper的Leader選舉流程

一、Zookeeper集羣 Zookeeper可以配置多個實例共同構成一個集羣對外提供服務以達到水平擴展的目的,每個服務器上的數據都是相同的,每一個服務器均可以對外提供讀和寫的服務,這點和Redis是相同的,即對客戶端來說每個服務器都是平等

原创 【Java】聊聊線程池,ThreadPoolExecutor源碼詳解

一、線程池起步 1. 線程池的基本介紹 首先Java裏的線程利用的線程模型是KLT,這帶來了許多好處,比如線程的阻塞不會帶來進程的阻塞,能更加高效地利用CPU的資源等。但這也意味着在Java裏的線程的創建和銷燬是一個相對偏且消耗資源的操作,

原创 【Java】Java中的動態代理以及在框架中的應用

一、靜態代理&動態代理 1. 靜態代理 我們先假設現在有怎麼一個需求,要求你在不改動原有代碼的情況下在所有類的方法前後打印日誌。我們很容易想到靜態代理,具體做法如下: 爲現有的所有類都編寫一個對應的代理類,並且還需要讓代理類與原有類實現

原创 【設計模式】併發編程下的單例模式

一、餓漢單例 1. 靜態變量實現 public class Singleton { private static Singleton instance = new Singleton(); private Singleton

原创 【TCP/IP】TCP協議的流程圖解

一、TCP協議起步 1. 什麼是TCP協議 TCP是面向連接的協議,這是因爲在一個應用進程可以開始向另一個應用進程發送數據之前,這兩個進程必須先相互“握手”,即它們必須相互發送某些預備報文段,以建立確保數據傳輸的參數。它有以下幾個特點:

原创 【TCP/IP】HTTP協議與HTTPS的加密流程

一、HTTP基礎知識 HTTP全稱Hyper Text Transfer Protocol,即超文本傳輸協議。HTTP是一個應用層協議,可視爲一個在計算機世界裏專門在兩點之間傳輸文字、圖片、音頻、視頻等超文本數據的約定和規範。 1. HT

原创 【Redis】緩存的三大問題及其解決方案

Redis經常用於系統中的緩存,這樣可以解決目前IO設備無法滿足互聯網應用海量的讀寫請求的問題。 一、緩存穿透 緩存穿透是指緩存和數據庫中都沒有的數據,而用戶不斷髮起請求,如發起id爲-1的數據或者特別大的不存在的數據。有可能是黑客利用漏洞

原创 【JVM】Java 中的經典垃圾回收器

從不同角度分析垃圾收集器,可以將其劃分爲不同的模型。 按線程數分,可以分爲串行垃圾回收器和並行垃圾回收器;按照工作模式分,可以分爲併發式垃圾回收器和獨佔式垃圾回收器;按碎片處理方式可分爲壓縮式垃圾回收器和非壓縮式垃圾回收器;而按工作的內存區

原创 【RabbitMQ】RabbitMQ 如何保證消息的可靠傳輸

一、可靠傳輸 本篇文章主要講 RabbitMQ 如何保證消息的可靠傳輸,所以在講RabbitMQ的實現之前,我們需要先來搞懂一個問題,就是什麼是消息的可靠傳輸。 在 RabbitMQ 中,一個消息從產生到被消費大致需要經過三個步驟,即生產者

原创 【RabbitMQ】RabbitMQ 進程結構分析與性能調優

原文鏈接:RabbitMQ 進程結構分析與性能調優 RabbitMQ是一個流行的開源消息隊列系統,是AMQP(高級消息隊列協議)標準的實現,由以高性能、健壯、可伸縮性出名的Erlang語言開發,並繼承了這些優點。業界有較多項目使用Rab

原创 【限流算法】常見的限流算法及其實現方式

在高併發的分佈式系統,如大型電商系統中,由於接口 API 無法控制上游調用方的行爲,因此當瞬間請求量突增時,會導致服務器佔用過多資源,發生響應速度降低、超時乃至宕機,甚至引發雪崩造成整個系統不可用。 面對這種情況,一方面我們會提升 API

原创 【NIO】Java的NIO的實現與BIO的優勢

BIO實現一個服務器 爲了更好的演示BIO與NIO之間的區別,我們先用一個服務器示例來了解一個BIO實現網絡通行的過程。 單線程下的BIO服務器 服務端 public class BioServer { public static

原创 【Java】Synchronized實現原理與常見面試題

前言 Synchronized 是常被我們用來保證臨界區以及臨界資源安全的解決方案。它可以保證當有多個線程訪問同一段代碼,操作共享數據時,其他線程必須等待正在操作線程完成數據處理後再進行訪問。即 Synchronized 可以達到線程互斥訪

原创 【Redis】利用 Redis 實現分佈式鎖

技術背景 首先我們需要先來了解下什麼是分佈式鎖,以及爲什麼需要分佈式鎖。 對於這個問題,我們可以簡單將鎖分爲兩種——內存級鎖以及分佈式鎖,內存級鎖即我們在 Java 中的 synchronized 關鍵字(或許加上進程級鎖修飾更恰當些),而