小型Redis完成! | 自己實現Redis源代碼(4)

緣起

近期在閱讀《Redis設計與實現》一書,我發現如果不動手實踐,顯然是無法真正理解書上奇形怪狀的數據結構的。

所以爲了鍛鍊自己的數據結構與算法能力,我參照其中一些數據結構的API,對諸如動態字符串SDS雙端鏈表list字典dict及其內嵌的哈希表dictht等數據結構進行了實現。

當然,爲了讓他們有用武之地,我在這基礎上構建了一個小型Redis,作爲自己的學習記錄。當然現在的項目功能還不夠完善,後期我會慢慢將其完善,懇請批評指教!

github鏈接



實現流程

如今本項目還只是實現了key-value的存儲功能,其他諸如切換數據庫、數據持久化等功能將會在後期慢慢實現。

項目實現流程如下:

  1. 基本數據結構的構建
  2. 客戶端服務端的交互
  3. 基本命令的實現



原理分析

1.基本數據結構的構建

下面主要介紹數據庫結構redisDb的構建,其他數據結構可以參見我的系列文章:

動態字符串SDS的實現 | 自己實現Redis源代碼(1)

雙端鏈表list的實現 | 自己實現Redis源代碼(2)

字典與哈希表 | 自己實現Redis源代碼(3)

數據庫redisDb的基本結構如下:

在這裏插入圖片描述



2. 客戶端服務端的交互

客戶端與服務端的結構如下
在這裏插入圖片描述

兩者通過建立網絡連接,進行數據交互,完成通信過程。這裏的網絡連接的建立是通過套接字socket建立的。

在Redis的單機應用中,一個服務端redisServer進程可以處理多個客戶端的請求。對多個客戶端的處理部分我們通過創建線程來完成。每次檢測到有一個客戶端進行連接,便爲其創建一個工作線程,在其中執行客戶端與服務端的通信操作。

服務端含有一個數據庫數組,記錄保存在服務端的所有數據庫,默認數據庫數量爲16。

客戶端含有一個數據庫指針,指向其當前正在使用的目標數據庫,方便其進行切換數據庫操作。



3. 基本命令的實現

這裏主要講解get/set命令的實現。

服務端結構到客戶端輸入的命令,需要進行一下操作:

1)判斷是否爲查看類命令

如,查看幫助文檔,查看版本信息等;

2)對命令進行分割
3)判斷命令關鍵字

如,命令爲set pig 12,切割後我們可以得到["set","pig","12"],通過對關鍵字set的判斷,可以得知其爲set命令。

4)檢查命令長度
5)執行相關命令



測試結果

在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章