原创 百行代碼實現基於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和內存等資源總是有限的,隨着數據量和訪問量的增加單

原创 Golang 實現 Redis(6): 實現 pipeline 模式的 redis 客戶端

本文是使用 golang 實現 redis 系列的第六篇, 將介紹如何實現一個 Pipeline 模式的 Redis 客戶端。 本文的完整代碼在Github:Godis/redis/client 通常 TCP 客戶端的通信模式都是阻塞式的:

原创 LSM 樹詳解

LSM樹(Log Structured Merged Tree)的名字往往給人一個錯誤的印象, 實際上LSM樹並沒有嚴格的樹狀結構。 LSM 樹的思想是使用順序寫代替隨機寫來提高寫性能,與此同時會略微降低讀性能。 LSM 的高速寫入能力與讀

原创 Redis 內存壓縮原理

Redis 無疑是一個大量消耗內存的數據庫,因此 Redis 引入了一些設計巧妙的數據結構進行內存壓縮來減輕負擔。ziplist、quicklist 以及 intset 是其中最常用最重要的壓縮存儲結構。 瞭解編碼類型 Redis對外提供了

原创 Redis 應用實戰

爲了提高系統吞吐量,我們經常在業務架構中引入緩存層。 緩存通常使用 Redis / Memcached 等高性能內存緩存來實現, 本文以 Redis 爲例討論緩存應用中面臨的一些問題。 緩存穿透 集合式緩存 熱點數據緩存 使用鎖保證高一

原创 Golang 實現 Redis(5): 使用跳錶實現 SortedSet

本文是使用 golang 實現 redis 系列的第五篇, 將介紹如何使用跳錶實現有序集合(SortedSet)的相關功能。 跳錶(skiplist) 是 Redis 中 SortedSet 數據結構的底層實現, 跳錶優秀的範圍查找能力爲Z