為了學習redis和更好地理解redis,決定自己寫乙個c++版本的redis
2. redis協議解析
第一,我這裡僅僅只是學習redis的思想。所以使用的是c++,而且很多資料結構使用stl。
第二,我這裡不追求效能,所以不會極致地去考慮效能問題,而是以實現功能為主。
對於看過redis原始碼的我來說,實際上就是一張非常大的雜湊表而已。
所以第一句話非常好寫
class
jedisdb
;
但是,作為現代c++的程式設計,我不太喜歡裸指標的管理,我希望能一切物件化。而且redis中也是用了乙個redisobject來抽象物件。
class
jobject
;class
jedisdb
;
很明顯,jobject會被我們做出純虛類。
jredisdb db;
intmain()
下core檔案存放資料結構
#ifndef __jstring_hh__
#define __jstring_hh__
#include
"jobject.hh"
#include
"stringutils.hh"
#include
#include
class jstring
: public jobject
explicit jstring
(const std:
:string& str)
:jobject()
,str_
(str)
virtual void
*data
() override
virtual void
print
() override
~jstring
()override =
default
;private:
std:
:string str_;};
#endif
#ifndef __jobject_hh__
#define __jobject_hh__
#include
class jobject;
using jobjectptr = std:
:shared_ptr
;class jobject
;#endif
到目前為止,雖然我們只是幹了乙個小事情。但實際上我們實現了當我們正確解析了命令後能夠對資料庫進行的操作。
因為我們這裡做的實際上是redis伺服器端的部分。所以在客戶端,我們希望仍然能使用redis的客戶端。因此,我們就需要理解redis客戶端的協議。
這裡僅僅以set name patientcat
這句話作為例子,其傳送的協議結果是
*3$3\r\nset\r\n$4\r\nname\r\n$10\r\npatientcat\r\n
看上去還是比較簡單的,第乙個*3
代表傳送了3個字串,然後$3
代表第乙個字串的長度是3,以此類推。
如果我們要使用redis的客戶端的話,那麼我們的伺服器就需要實現一些不要的功能。因此,我們就使用telnet協議作為客戶端。telnet協議會在每個命令之後加入\r\n。
那麼我們就簡單地按照字串解析就可以了。
有了上述儲備,實際上我們就可以實現乙個簡單地redis伺服器了,實際上就是乙個簡單地telnet伺服器加一些改裝。
下redisserver_0.1中完成了這個功能。
從零開始 寫乙個認證授權sdk
主題列表 juejin,github,smartblue,cyanosis,channing cyan,fancy,hydrogen,condensed night purple,greenwillow,v green,vue pro,healer readable,mk cute,jzman,ge...
怎麼從零開始寫乙個秒殺專案
一,環境搭建 技術選型,該秒殺專案是採用springboot2.0和springcloud來開發的 1首先搭建父專案,所有的模組都是依賴該父專案 2搭建服務註冊中心模組 eureka 3秒殺使用者模組 整合mybatis,web,thymeleaf等 相當於買家 4公共模組,對應的是資料庫表對應的實...
從零開始寫乙個jquery日曆外掛程式(一)
簡單來說,jquery外掛程式為擴充套件jquery原型物件的乙個方法。編寫jquery外掛程式其實就是給jquery原型新增乙個自定義的方法。我們先來看乙個最簡單的例子 a attr href 這裡使用jquery選擇器,來查詢a元素,並返回乙個jquery物件。我們就可以通過這個物件來使用jqu...