原创 從小白到架構師(4): Feed 流系統實戰

「從小白到架構師」系列努力以淺顯易懂、圖文並茂的方式向各位讀者朋友介紹 WEB 服務端從單體架構到今天的大型分佈式系統、微服務架構的演進歷程。讀了三篇萬字長文之後各位想必已經累了(主要是我寫累了😏), 今天我們回來看看小明和他的「淘金網」的

原创 從小白到架構師(3): 揭開分佈式數據庫的面紗

「從小白到架構師」系列努力以淺顯易懂、圖文並茂的方式向各位讀者朋友介紹 WEB 服務端從單體架構到今天的大型分佈式系統、微服務架構的演進歷程。「從小白到架構師」 系列的前兩篇中多次提到各類分佈式數據庫,第三篇文章「揭開分佈式系統的面紗」我們

原创 從小白到架構師(2): 走向微服務

「從小白到架構師」系列努力以淺顯易懂、圖文並茂的方式向各位讀者朋友介紹 WEB 服務端從單體架構到今天的大型分佈式系統、微服務架構的演進歷程。在「從小白到架構師」系列的第一篇《應對高併發》中,我們介紹了通過緩存、橫向擴容、消息隊列、分佈式數

原创 從小白到架構師(1): 應對高併發

「從小白到架構師」系列努力以淺顯易懂、圖文並茂的方式向各位讀者朋友介紹 WEB 服務端從單體架構到今天的大型分佈式系統、微服務架構的演進歷程。本文是「從小白到架構師」系列的第一篇,主要講述提升網站吞吐量、應對更高併發量的主要技術手段。 從個

原创 Go 語言圖片處理簡明教程

雖然 Go 語言主要用於 Web 後端以及各類中間件和基礎設施開發,也難免遇到一些圖像處理的需求。Go 語言提供的 image 標準庫提供了基本的圖片加載、裁剪、繪製等能力,可以幫助我們實現一些繪圖需求。 加載圖片 image.Decode

原创 百行代碼實現基於Redis的可靠延遲隊列

在之前探討延時隊列的文章中我們提到了 redisson delayqueue 使用 redis 的有序集合結構實現延時隊列,遺憾的是 go 語言社區中並無類似的庫。不過問題不大,沒有輪子我們自己造😎。 本文的完整代碼實現在hdt3213/d

原创 Web 後端的一生之敵:分頁器

分頁器是 Web 開發中常見的功能,看似簡單的卻經常隱藏着各種奇怪的坑,堪稱 WEB 後端開發的一生之敵。 常見問題 邊翻頁邊寫入導致內容重複 某位用戶正在瀏覽我的博客,他看到第一頁最後一篇文章是 《Redis 緩存更新一致性》: 在他瀏

原创 Golang 實現 Redis(11): RDB 文件格式

RDB 文件使用二進制方式存儲 Redis 內存中的數據,具有體積小、加載快的優點。本文主要介紹 RDB 文件的結構和編碼方式,並藉此探討二進制編解碼和文件處理方式,希望對您有所幫助。 本文基於 RDB version9 編寫, 完整解析

原创 Golang 實現 Redis(10): 本地原子性事務

爲了支持多個命令的原子性執行 Redis 提供了事務機制。 Redis 官方文檔中稱事務帶有以下兩個重要的保證: 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打

原创 實用TCP協議(2):TCP 參數優化

在瞭解 TCP 的基本機制後本文繼續介紹 Linux 內核提供的鏈接隊列、TW_REUSE、SO_REUSEPORT、SYN_COOKIES 等機制以優化生產環境中遇到的性能問題。 連接隊列 Linux 內核會維護兩個隊列: 半連接隊列:

原创 實用TCP協議(1):TCP 協議簡介

傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。TCP 協議假設下層協議可以提供簡單的不可靠數據報, 並在此基礎上構建可靠的端到端字節流服務。TCP 協

原创 看動畫輕鬆學會 Raft 算法

由於 Paxos 算法過於晦澀難懂且難以實現,Diego Ongaro 提出了一種更易於理解和實現並能等價於 Paxos 算法的共識算法 - Raft 算法。 因爲 Raft 算法清晰易懂越來越多的開源項目嘗試引入 Raft 算法來解決分佈

原创 Golang 實現 Redis(9): 使用GeoHash 搜索附近的人

本文是使用 golang 實現 redis 系列的第九篇,主要介紹如何使用 GeoHash 實現搜索附近的人。 搜索附近的POI是一個非常常見的功能,它的技術難點在於地理位置是二維的(經緯度)而我們常用的索引(無論是B樹、紅黑樹還是跳錶)都

原创 Golang 實現 Redis(8): TCC分佈式事務

本文是使用 golang 實現 redis 系列的第八篇, 將介紹如何在分佈式緩存中使用 Try-Commit-Catch 方式來解決分佈式一致性問題。 godis 集羣的源碼在Github:Godis/cluster 在上一篇文章中我們使

原创 Golang 實現 Redis(7): Redis 集羣與一致性 Hash

本文是使用 golang 實現 redis 系列的第七篇, 將介紹如何將單點的緩存服務器擴展爲分佈式緩存。godis 集羣的源碼在Github:Godis/cluster 單臺服務器的CPU和內存等資源總是有限的,隨着數據量和訪問量的增加單