破玩意 | Redis 為什麼那麼快
./redis-server
宏觀上看下我的流程
int main(int argc, char **argv) {
...
initServer();
...
aeCreateFileEvent(fd, acceptHandler, ...);
...
aeMain();
...
}
void aeMain(aeEventLoop *eventLoop)
{
eventLoop->stop = 0;
while (!eventLoop->stop)
aeProcessEvents(eventLoop, AE_ALL_EVENTS);
}
展開體驗下我的具體工作
redis-cli -h host -p port
static void acceptHandler(...) {
...
cfd = anetAccept(...);
...
c = createClient(cfd))
...
}
static redisClient *createClient(int fd) {
...
aeCreateFileEvent(c->fd, readQueryFromClient, ...);
...
}
void aeMain(aeEventLoop *eventLoop)
{
eventLoop->stop = 0;
while (!eventLoop->stop)
aeProcessEvents(eventLoop, AE_ALL_EVENTS);
}
為了方便大家吹牛,我來拔高一下
具體怎麼執行一個 Redis 命令
<client 6379> set dibingfa niubi
static struct redisCommand cmdTable[] = {
{"get",getCommand,2,REDIS_CMD_INLINE},
{"set",setCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM},
{"setnx",setnxCommand,3,REDIS_CMD_BULK|REDIS_CMD_DENYOOM},
{"del",delCommand,-2,REDIS_CMD_INLINE},
{"exists",existsCommand,2,REDIS_CMD_INLINE},
...
}
static void setCommand(redisClient *c) {
...
addReply(c, nx ? shared.cone : shared.ok);
}
static void addReply(redisClient *c, robj *obj) {
...
aeCreateFileEvent(server.el, c->fd, AE_WRITABLE,
sendReplyToClient, c, NULL) == AE_ERR);
}
後記
後記
整篇文章我好像沒講 Redis 為啥那麼快,因為我感覺這個問題問得不好。
你可以從接收網路請求的 IO 多路複用角度說起,也可以從事件處理器驅動的 Reactor 模式說起,還可以從具體處理命令時的資料結構說起,比如單單是字串背後的 sds 其實就做了很多的巧妙設計。
如果我是面試官,我會具體讓面試者聊聊 Redis 的啟動流程,或者 Redis 處理命令的整個流程。
這裡面可挖的點挺多的,如果能談笑風生,那自然是技術水平還不錯。
另外,你會發現本文出現的很多唬人的術語,比如 Reactor 模式,事件處理器等,看一遍 Redis 原始碼後你會發現真的非常簡單。
毫不客氣地說,一切絲毫不談具體實現,和你堆砌一大堆唬人名詞的文章或者人,都是在耍流氓。
本文我參考的是 Redis3.0.0 原始碼,但成文時用的講解程式碼是 Redis1.0.0,整個網路模組的設計是完全一樣的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925892/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Redis為什麼那麼快?Redis
- 京東二面,Redis為什麼那麼快?Redis
- Kafka為什麼速度那麼快?Kafka
- redis為什麼快Redis
- Redis為什麼這麼快?Redis
- redis淘汰+過期雙向保證高可用 | redis 為什麼那麼快?Redis
- 為什麼要用Redis?Redis為什麼這麼快?(來自知乎)Redis
- redis字典快速對映+hash釜底抽薪+漸進式rehash | redis為什麼那麼快Redis
- 為什麼Redis這麼快?5分鐘成為Redis高手Redis
- 硬核!15張圖解Redis為什麼這麼快圖解Redis
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- 為什麼要使用Redis做快取Redis快取
- 火了那麼久的區塊鏈,到底是個什麼玩意?區塊鏈
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- Redis 為什麼這麼快?這才是最完美的回答Redis
- redis是單執行緒的,為什麼這麼快Redis執行緒
- 比Redis快5倍的中介軟體,究竟為什麼這麼快?Redis
- csdn什麼玩意兒嗎
- Redis單執行緒,為什麼速度快Redis執行緒
- Nginx 為什麼這麼快?Nginx
- 為什麼 python 那麼熱門Python
- 為什麼SSL證書那麼貴?
- Kafka 為什麼快Kafka
- 阿里面試:2 億資料秒查,MySQL 索引為什麼那麼快?阿里面試MySql索引
- 為什麼要用RedisRedis
- 為什麼資料備份那麼重要?
- 遊戲的留存為什麼那麼難調?遊戲
- 為什麼遊戲DLC的精品那麼少?遊戲
- 物聯網路卡為什麼那麼火
- 快速排序為什麼這麼快?排序
- 為什麼要使用 Redis?Redis
- 在遊戲裡“翻盤”為什麼那麼難?遊戲
- iOS應用加固為什麼也那麼重要?iOS
- Python 編碼為什麼那麼蛋疼?Python
- 為什麼那麼多人都想進入IT行業?行業
- 為什麼bootstrap不再那麼受歡迎了?boot
- HTML和CSS是什麼玩意兒?HTMLCSS
- 為什麼有那麼多人選擇“人工智慧”,真的有那麼好嗎?人工智慧