欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

200 行 C 代碼實(shí)現(xiàn)插件式 NOSQL 存儲(chǔ)服務(wù)器(一)

系統(tǒng) 3807 0

?200 行 C 代碼實(shí)現(xiàn)插件式 NOSQL 存儲(chǔ)服務(wù)器(一)
2012-11-24 22:30 by Haippy, 837 閱讀, 1 評(píng)論, 收藏, 編輯

初一看,你肯定會(huì)覺得作者在忽悠人吧,200 行 C 代碼居然可以實(shí)現(xiàn)插件式 NOSQL 存儲(chǔ)服務(wù)器?是的,200 行 C 代碼確實(shí)可以做到,但只能是一個(gè)極其簡(jiǎn)單的代碼框架而已,不過感興趣的同鞋可以在此基礎(chǔ)上進(jìn)行擴(kuò)展。
引言

好 了不多說,究竟什么才是插件式( Pluggable )的存儲(chǔ)服務(wù)器呢,想必大家都用過 MySQL吧,它就是一款典型的插件式關(guān)系型數(shù)據(jù)服務(wù)器,MySQL 下面比較有名的存儲(chǔ)引擎有 MyISAM, InnoDB, MEMORY 等。另外大名鼎鼎的 Memcached 的開發(fā)版(1.6版,即官方代碼倉庫中的 engine-pu 分支)也開始支持插件式存儲(chǔ)引擎,這意味著以后你可以使用 Memcached 的其他存儲(chǔ)引擎了,而不是僅僅將數(shù)據(jù)緩存在內(nèi)存中。

首先插件式存儲(chǔ)服務(wù)器的一種可能的設(shè)計(jì)架構(gòu)圖如下:

按 照典型的分層設(shè)計(jì)模式,最上層是網(wǎng)絡(luò)連接層(Connectin Layer),其次是中間處理層,包括 Cache 和 各種 Buffers、協(xié)議分析器、以及其他工具,再是公共存儲(chǔ)抽象服務(wù)層,然后最下層是各種存儲(chǔ)引擎,上圖中列舉了內(nèi)存式,sqlite,leveldb等存 儲(chǔ)引擎,當(dāng)然你也可以實(shí)現(xiàn)自己的存儲(chǔ)引擎。

1、網(wǎng)絡(luò)連接層(Connection Layer):負(fù)責(zé)處理網(wǎng)絡(luò)連接,該層主要考慮如何高效地處理大量并發(fā)網(wǎng)絡(luò)連接,讀者可以閱讀 Memcached 1.6 的源碼來了解更多相關(guān)的技術(shù)。

2、中間處理層(Median Handle Layer):該層的功能包括 Cache 和各種 Buffers 的管理,協(xié)議解析,可能的查詢優(yōu)化,以及其他的工具。

3、公共存儲(chǔ)抽象服務(wù)層(Common Storage Abstract Service Layer):該層主要和下層的存儲(chǔ)引擎進(jìn)行交互。

4、存儲(chǔ)引擎層(Storage Layer):各種存儲(chǔ)引擎的實(shí)現(xiàn)。

不過,為了保持本文簡(jiǎn)介和直觀,我們?cè)诖酥魂P(guān)注第3、4層,即公共存儲(chǔ)抽象服務(wù)層(Common Storage Abstract Service Layer)和 存儲(chǔ)引擎層(Storage Layer),

本 文以下部分將用簡(jiǎn)短的 C 代碼解釋如何實(shí)現(xiàn)公共存儲(chǔ)抽象服務(wù)層(Common Storage Abstract Service Layer)和存儲(chǔ)引擎層(Storage Layer),同時(shí)為了簡(jiǎn)單起見,我們沒有實(shí)現(xiàn)自己的存儲(chǔ)引擎,而是借助 sqlite 和 leveldb 作為持久化的存儲(chǔ)引擎,另外 in-memory 使用 uthash 作為存儲(chǔ)后端。
實(shí)現(xiàn)細(xì)節(jié)
文件描述
復(fù)制代碼

├── csas.c
├── csas.h
├── example-engine.c
├── example-engine.h
├── inmemory-engine.c
├── inmemory-engine.h
├── leveldb-engine.c
├── leveldb-engine.h
├── main.c
├── Makefile
├── sqlite-engine.c
└── sqlite-engine.h

復(fù)制代碼

本文涉及的代碼一共 12 個(gè)文件(c文件、h文件、Makefile),其中各個(gè)文件功能如下:

??? csas.h, csas.c:Common Storage Abstract Service(CSAS)實(shí)現(xiàn)文件。
??? example-engine.c, example-engine.h:如何實(shí)現(xiàn)自己的存儲(chǔ)引擎,即自定義存儲(chǔ)引擎需要實(shí)現(xiàn)的接口。
??? inmemory-engine.c, inmemory-engine.h:內(nèi)存式存儲(chǔ)引擎,基于 uthash。
??? leveldb-engine.c, leveldb-engine.h:持久化存儲(chǔ)引擎,基于 google 的 Leveldb。
??? sqlite-engine.c, sqlite-engine.h:持久化存儲(chǔ)引擎,基于 sqlite。
??? main.c:測(cè)試文件。
??? Makefile:Makefile 文件。

復(fù)制代碼

/*
?* =============================================================================
?*
?*?????? Filename:? csas.h
?*
?*??? Description:? common storage abstract service.
?*
?*??????? Created:? 11/24/2012 03:16:19 PM
?*
?*???????? Author:? Fu Haiping (forhappy), haipingf@gmail.com
?*??????? Company:? ICT ( Institute Of Computing Technology, CAS )
?*
?* =============================================================================
?*/
#ifndef CSAS_H
#define CSAS_H

typedef struct engine_s_ engine_t;
typedef struct csas_context_s_ csas_context_t;
typedef struct engine_operation_s_ engine_operation_t;

struct csas_context_s_ {
??? csas_context_t *next;
??? engine_t *engine;
??? /* other stuff here... */
};

struct engine_s_ {
??? char *engine_name;
??? unsigned int version;
??? engine_operation_t *engine_ops;

??? /* more stuff about storage engine here... */
};

struct engine_operation_s_ {
??? int (*put)(engine_t *engine,
??????????? const char *key, unsigned int key_len,
??????????? const char *value, unsigned int value_len);

??? char * (*get)(engine_t *engine,
??????????? const char *key, unsigned int key_len,
??????????? unsigned int *value_len);

??? int (*delete)(engine_t *engine,
??????????? const char *key, unsigned int key_len);

??? int (*unsupported_operation)(engine_t *engine);
};

csas_context_t * csas_init(engine_t *engine);

void csas_destory(csas_context_t *context);

int csas_put(csas_context_t *context,
??????? const char *key, unsigned int key_len,
??????? const char *value, unsigned int value_len);

char * csas_get(csas_context_t *context,
??????? const char *key, unsigned int key_len,
??????? unsigned int *value_len);

int csas_delete(csas_context_t *context,
??????? const char *key, unsigned int key_len);

#endif /* CSAS_H */

復(fù)制代碼
復(fù)制代碼

/*
?* =============================================================================
?*
?*?????? Filename:? csas.c
?*
?*??? Description:? common storage abstract service.
?*
?*??????? Created:? 11/24/2012 03:16:38 PM
?*
?*???????? Author:? Fu Haiping (forhappy), haipingf@gmail.com
?*??????? Company:? ICT ( Institute Of Computing Technology, CAS )
?*
?* =============================================================================
?*/
#include <assert.h>
#include <stdlib.h>
#include "csas.h"

csas_context_t * csas_init(engine_t *engine)
{
??? csas_context_t *context =
??????? (csas_context_t *)malloc(sizeof(csas_context_t));
??? context->engine = engine;
??? context->next = NULL;
??? return context;

}

void csas_destory(csas_context_t *context)
{
??? assert(context != NULL);

??? if (context->engine != NULL) {
??????? free(context->engine);
??? }
??? free(context);

}

int csas_put(csas_context_t *context,
??????? const char *key, unsigned int key_len,
??????? const char *value, unsigned int value_len)
{
??? int ret = -1;
??? ret = context->engine->engine_ops->put(context->engine,
??????????? key, key_len, value, value_len);
??? return ret;
}

char * csas_get(csas_context_t *context,
??????? const char *key, unsigned int key_len,
??????? unsigned int *value_len)
{
??? char *retstr = NULL;
??? retstr = context->engine->engine_ops->get(context->engine,
??????????? key, key_len, value_len);
??? return retstr;
}

int csas_delete(csas_context_t *context,
??????? const char *key, unsigned int key_len)
{
??? int ret = -1;
??? ret = context->engine->engine_ops->delete(context->engine,
??????????? key, key_len);
}

復(fù)制代碼

那么如何實(shí)現(xiàn)自己的存儲(chǔ)引擎呢,你只要按照以下示例代碼實(shí)現(xiàn)存儲(chǔ)引擎相關(guān)的接口即可,目前只需要實(shí)現(xiàn)如下接口:
復(fù)制代碼

#ifndef EXAMPLE_ENGINE_H
#define EXAMPLE_ENGINE_H
#include "csas.h"

extern engine_t * engine_example_init();

#endif /* EXAMPLE_ENGINE_H */

復(fù)制代碼
復(fù)制代碼

/*
?* =============================================================================
?*
?*?????? Filename:? example-engine.c
?*
?*??? Description:? example storage engine.
?*
?*??????? Created:? 11/24/2012 03:49:34 PM
?*
?*???????? Author:? Fu Haiping (forhappy), haipingf@gmail.com
?*??????? Company:? ICT ( Institute Of Computing Technology, CAS )
?*
?* =============================================================================
?*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "example-engine.h"

static int put(engine_t *engine,
??????? const char *key, unsigned int key_len,
??????? const char *value, unsigned int value_len)
{
??? printf("hook call to example put.\n");
??? return 0;
}

static char * get(engine_t *engine,
??????? const char *key, unsigned int key_len,
??????? unsigned int *value_len)
{
??? printf("hook call to example engine get.\n");
??? return NULL;
}

static int delete(engine_t *engine,
??????? const char *key, unsigned int key_len)
{
??? printf("hook call to example engine delete.\n");
}

engine_t * engine_example_init(void)
{
??? engine_t *engine = (engine_t *) malloc(sizeof(engine_t));
??? engine_operation_t *engine_ops = (engine_operation_t *)
??????? malloc(sizeof(engine_operation_t));

??? const char *engine_name = "example engine v0.1";
??? unsigned int engine_name_len = strlen(engine_name);
??? unsigned int version = 0x1;

??? engine->engine_name = malloc(sizeof(char) * (engine_name_len + 1));
??? memset(engine->engine_name, 0, (engine_name_len + 1));
??? strncpy(engine->engine_name, engine_name, engine_name_len);
??? engine->version = version;

??? engine_ops->put = put;
??? engine_ops->get = get;
??? engine_ops->delete = delete;

??? engine->engine_ops = engine_ops;
}

復(fù)制代碼

測(cè)試代碼如下:
復(fù)制代碼

/*
?* =============================================================================
?*
?*?????? Filename:? main.c
?*
?*??? Description:? main routine.
?*
?*??????? Created:? 11/24/2012 05:58:22 PM
?*
?*???????? Author:? Fu Haiping (forhappy), haipingf@gmail.com
?*??????? Company:? ICT ( Institute Of Computing Technology, CAS )
?*
?* =============================================================================
?*/
#include <stdio.h>

#include "leveldb-engine.h"
#include "sqlite-engine.h"

int main(int args, const char *argv[])
{
??? engine_t *engine_leveldb = engine_leveldb_init();
??? engine_t *engine_sqlite = engine_sqlite_init();

??? csas_context_t *context_leveldb = csas_init(engine_leveldb);
??? csas_context_t *context_sqlite = csas_init(engine_sqlite);

??? csas_put(context_leveldb, "hello", 5, "world", 5);

??? csas_put(context_sqlite, "hello", 5, "world", 5);

}

復(fù)制代碼

(待續(xù)) 以上是本文前一部分內(nèi)容,接下來會(huì)慢慢完善的,這個(gè)小項(xiàng)目的代碼整理后會(huì)放到 github 上,感興趣的同學(xué)可以一起討論討論。:-)


200 行 C 代碼實(shí)現(xiàn)插件式 NOSQL 存儲(chǔ)服務(wù)器(一) - Haippy - 博客園


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 成人18免费网站在线观看 | 欧美在线性视频 | 国产人成精品综合欧美成人 | 国产一三区A片在线播放 | 久久综合偷拍 | 久久99热久久精品在线6 | 奇米成人网 | 一区二区av| 天天操天天干天天操 | 免费在线观看www | 91av爱爱| 国产成人91 | 欧美搞黄视频 | 国产成人一区二区三区电影 | 亚洲欧美精品一中文字幕 | 黄色av毛片 | 精品一卡2卡三卡4卡免费观看 | 一级性黄色片 | 91短视频版在线观看免费大全 | 欧美一区二区三区久久精品 | 一本色道久久综合 | 天天搞天天操 | 激情九月| 午夜成人免费视频 | 午夜手机福利 | 欧美自拍视频 | 色婷婷成人做爰A片免费看网站 | 欧美日韩不卡 | 午夜在线免费观看 | 日韩一级一欧美一级国产 | 美国三级日本三级久久99 | 人人爱天天做夜夜爽88 | heyzo欧美 | 色婷婷精品国产一区二区三区 | 日本精品不卡 | 999jjj在线播放 | 久久永久免费中文字幕 | 亚洲最大黄色网址 | 国产在线精品一区二区夜色 | 东京一热本色道久久爱 | 成人午夜视频在线观看 |