Redisの組み込み実装。 http://vedis.symisc.net
Vedisは、Redisに類似した70を超えるコマンドで構築された組み込み可能なDataStore Cライブラリですが、Vedisがホストアプリケーションと同じプロセスで実行されて以来、ネットワークレイヤーはありません。
他のほとんどのデータストア(つまりmemcache、redis)とは異なり、vedisには個別のサーバープロセスがありません。 Vedisは、通常のディスクファイルを読み取り、直接書き込みます。複数のコレクションを備えた完全なデータベースは、単一のディスクファイルに含まれています。データベースファイル形式はクロスプラットフォームです。32ビットと64ビットシステムの間、または大エンディアンとリトルエンディアンのアーキテクチャ間でデータベースを自由にコピーできます。
Vedisは、依存関係のない自己完結型Cライブラリです。外部ライブラリまたはオペレーティングシステムからの非常に最小限のサポートが必要です。これにより、デスクトップコンピューターのサポートインフラストラクチャがない組み込みデバイスでの使用に適しています。これにより、Vedisは、さまざまな構成のさまざまなコンピューターで変更せずに実行する必要があるアプリケーション内での使用に適しています。
データストアエンジンの主要なタスクは、できるだけ早くレコードを保存および取得することです。 Vedisは、構造化されたデータストレージと生データストレージの両方をサポートしています。
構造化されたデータストレージは、コマンド実行インターフェイス(CEI)を介してクライアントに提示されます。基本的に、vedis_exec()を介して1つ以上のコマンドを実行します(つまり、キー値を設定します。キー、hset ...を取得、hset ...)vedis_exec_result()を介して実行結果(コマンドの返品値)を抽出します。組み込みコマンドのリストについては、次のページを参照してください。
生データストレージは、キー/バリューストアインターフェイスを介してクライアントに提示されます。 Vedisは、Berkeley DB、Tokyo Cabinet、LevelDBなどに似た標準的なキー/バリューストアですが、トランザクション(酸)、同時読者などのサポートを含む豊富な機能セットがあります。
KVストアの下では、キーと値の両方がバイトの単純な配列として扱われるため、コンテンツはASCII文字列、バイナリブロブ、さらにはディスクファイルからでも何でもできます。 KVストアレイヤーは、インターフェイスのセットを介してクライアントに提示されます。これらには、vedis_kv_store()、vedis_kv_append()、vedis_kv_fetch_callback()、vedis_kv_append_fmt()などが含まれます。
vedis *pStore; /* Datastore handle */
int rc;
/* Create our datastore */
rc = vedis_open(&pStore,argc > 1 ? argv[ 1 ] /* On-disk DB */ : " :mem: " /* In-mem DB */ );
if ( rc != VEDIS_OK ){ /* Seriously? */ return ; }
/* Execute the simplest command */
rc = vedis_exec(pStore, " SET test 'Hello World' " ,- 1 );
if ( rc != VEDIS_OK ){ /* Handle error */ }
/* Another simple command (Multiple set) */
rc = vedis_exec(pStore, " MSET username james age 27 mail [email protected] " ,- 1 );
if ( rc != VEDIS_OK ){ /* Handle error */ }
/* A quite complex command (Multiple hash set) using foreign data */
rc = vedis_exec_fmt(pStore,
" HMSET config pid %d user %s os %s scm %s " ,
1024 /* pid */ ,
" dean " , /* user */
" FreeBSD " , /* OS */
" Git " /* SCM */
);
if ( rc != VEDIS_OK ){ /* Handle error */ }
/* Fetch some data */
rc = vedis_exec(pStore, " GET test " ,- 1 );
if ( rc != VEDIS_OK ){ /* Seriously? */ }
/* Extract the return value of the last executed command (i.e. 'GET test') " */
vedis_exec_result (pStore,&pResult);
{
const char *zResponse;
/* Cast the vedis object to a string */
zResponse = vedis_value_to_string (pResult, 0 );
/* Output */
printf ( " test ==> %s n " ,zResponse); /* test ==> 'Hello world' */
}
vedis_exec (pStore, " GET mail " ,- 1 );
/* 'GET mail' return value */
vedis_exec_result (pStore,&pResult);
{
const char *zResponse;
/* Cast the vedis object to a string */
zResponse = vedis_value_to_string (pResult, 0 );
/* Output */
printf ( " mail ==> %s n " ,zResponse); /* Should be '[email protected]' */
}
/*
* A command which return multiple value in array.
*/
vedis_exec (pStore, " MGET username age " ,- 1 ); /* james 27 */
vedis_exec_result (pStore,&pResult);
if ( vedis_value_is_array(pResult) ){
/* Iterate over the elements of the returned array */
vedis_value *pEntry;
puts ( " Array entries: " );
while ((pEntry = vedis_array_next_elem (pResult)) != 0 ){
const char *zEntry;
/* Cast to string and output */
zEntry = vedis_value_to_string (pEntry, 0 );
/* Output */
printf ( " t %s n " ,zEntry);
}
}
/* Extract hashtable data */
vedis_exec (pStore, " HGET config pid " ,- 1 ); /* 1024 */
vedis_exec_result (pStore,&pResult);
{
int pid;
/* Cast to integer */
pid = vedis_value_to_int (pResult);
/* Output */
printf ( " pid ==> %d n " ,pid); /* Should be 1024 */
}
/* Finally, auto-commit the transaction and close our datastore */
vedis_close (pStore);http://vedis.symisc.netにアクセスしてください