高性能NoSql數(shù)據(jù)庫 SSDB

今天在看一個開源項目的時候蹲缠,發(fā)現(xiàn)作者使用一個ssdb的數(shù)據(jù)庫斋射,第一反應(yīng)是ssd硬盤,當(dāng)時很詫異蕾额。后面了解后才知道早芭,原來是 nosql數(shù)據(jù)庫。

ssdb介紹

一個高性能的支持豐富數(shù)據(jù)結(jié)構(gòu)的 NoSQL 數(shù)據(jù)庫, 用于替代 Redis.
SSDB 是一個 C/C++ 語言開發(fā)的高性能 NoSQL 數(shù)據(jù)庫, 支持 KV, list, map(hash), zset(sorted set) 等數(shù)據(jù)結(jié)構(gòu), 用來替代或者與 Redis 配合存儲十億級別列表的數(shù)據(jù).SSDB 具有和 Redis 相似的 API, 持的客戶端包括: PHP, C++, Python, Java, Lua, Ruby, Nodejs, etc.

SSDB 是穩(wěn)定的, 生產(chǎn)環(huán)境使用的, 已經(jīng)在許多互聯(lián)網(wǎng)公司得到廣泛使用, 如奇虎 360, TOPGAME.

如果诅蝶,你會使用 redis退个,那你就很容易上手。

下載安裝

下面是具體的安裝過程调炬,我在mac和ubuntu上安裝语盈。

編譯和安裝
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make
# 將安裝在 /usr/local/ssdb 目錄下
sudo make install

如果你想安裝 ssdb 在其它的目錄, 不在 /usr/local 目錄下, 可以這樣

sudo make install PREFIX=/your/direcotry
問題解決

如果出現(xiàn)如下錯誤:

g++ ...deps/snappy-1.1.0/.libs/libsnappy.a: No such file or directory
make[1]: *** [all] Error 1

或者

g++ ...deps/jemalloc-3.3.1/lib/libjemalloc.a: No such file or directory
make[1]: *** [all] Error 1

這是因為 Snappy 或者 Jemalloc 沒有編譯成功, 這一般是因為你的系統(tǒng)時鐘有問題. 可以這樣解決:

cd deps/snappy-1.1.0
autoreconf --force --install
./configure
make

或者

cd deps/jemalloc-3.3.1
autoreconf --force --install
./configure
make

啟動和停止

# 啟動主庫, 此命令會阻塞住命令行
./ssdb-server ssdb.conf

# 或者啟動為后臺進程(不阻塞命令行)
./ssdb-server -d ssdb.conf

# 停止 ssdb-server
./ssdb-server ssdb.conf -s stop
# 對于舊版本
kill `cat ./var/ssdb.pid`

# 重啟
./ssdb-server ssdb.conf -s restart

到目前為止, 你需要手動管理 ssdb-server 進程, 如果你希望在操作系統(tǒng)啟動和停止時自動地管理, 請按下面的說明進行.

SSDB 啟動腳本(隨操作系統(tǒng)自啟動)
假設(shè)你已經(jīng)安裝 SSDB 在默認的 /usr/local/ssdb 目錄, 把 tools/ssdb.sh 腳本放到 /etc/init.d 目錄下.

注意: 對于 CentOS 用戶, 請將 ssdb.sh 重命名為 ssdb.
編輯下面的內(nèi)容:

# each config file for one instance
configs=/data/ssdb_data/test/ssdb.conf
將 /data/ssdb_data/test/ssdb.conf 修改為你的 SSDB 配置文件的路徑. 如果你有多個 SSDB 實例, 那么把它們寫在一行, 用空格來分隔, 例如:

# each config file for one instance
configs=/data/ssdb_data/test/ssdb.conf /data/ssdb_data/demo/ssdb.conf

# CentOS

sudo chkconfig --add ssdb
sudo chkconfig ssdb on

# Ubuntu
sudo chmod a+x /etc/init.d/ssdb
sudo update-rc.d ssdb defaults

SSDB 默認安裝在 /usr/local/ssdb 錄下. ssdb-server 是服務(wù)器的程序, ssdb-cli 是命令 客戶端.
在使 帶的 ssdb.conf 配置 件時, SSDB 成的 志 件按體積進 分割, 僅此 已. 所 以, 你需要編寫 的 crontab 進 志壓縮和定期清理.
如果出現(xiàn)服務(wù)器掉電, kernel panic 等系統(tǒng)故障, 在系統(tǒng)重新啟動之后, 你需要 動刪除 ssdb 的 PID 件 ssdb.pid, 然后才能啟動 ssdb-server.
另外, 你可以參考下 的做法, 在系統(tǒng)啟動和關(guān)機時, 啟動和關(guān)閉 ssdb-server:

#!/bin/sh
case "$1" in
  'start')
               /usr/local/ssdb/ssdb-server -d /usr/local/ssdb/
    ssdb.conf
               echo "ssdb started."
               ;;
  'stop')
               kill `cat /usr/local/ssdb/var/ssdb.pid`
               echo "ssdb stopped."
               ;;
  'restart')
   
   
   
    ssdb.conf
   
kill `cat /usr/local/ssdb/var/ssdb.pid`
echo "ssdb stopped."
sleep0.5
/usr/local/ssdb/ssdb-server -d /usr/local/ssdb/
           echo "ssdb started."
           ;;
  *)
               echo "Usage: $0 {start|stop|restart}"
    exit1   ;;
esac

把 件保存為 /etc/init.d/ssdb.sh(需要 root 權(quán)限), 然后執(zhí) : chmod ugo+x /etc/init.d/ssdb.sh
這樣, ssdb-server 就可以隨著操作系統(tǒng)啟動和關(guān)閉了.

架構(gòu)

使SSDB命令客戶端(ssdb-cli)

SSDB 的命令 客戶端 ssdb-cli 可 于 常管理, 包括查看 SSDB 的運 狀態(tài)(info), 還能做 些 API 沒有的操作, 如清空整個數(shù)據(jù)庫.
運 ssdb-cli 連接到 127.0.0.1:8888,

youdi@liangchangyoudeMacBook-Pro  ~/OtherProject/ssdb-master/tools  ./ssdb-cli -p 8888
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io

'h' or 'help' for help, 'q' to quit.

ssdb-server 1.9.5

ssdb 127.0.0.1:8888> h

# display ssdb-server status
    info
# escape/do not escape response data
    : escape yes|no
# export/import
    export [-i] out_file
        -i  interactive mode
    import in_file

see http://ssdb.io/docs/php/ for commands details

press 'q' and Enter to quit.

ssdb 127.0.0.1:8888> info
version
    1.9.5
links
    1
total_calls
    5
dbsize
    0
binlogs
        capacity : 20000000
        min_seq  : 0
        max_seq  : 1
serv_key_range
        kv  : "" - ""
        hash: "" - ""
        zset: "" - ""
        list: "" - ""
data_key_range
        kv  : "k" - "k"
        hash: "" - ""
        zset: "" - ""
        list: "" - ""
leveldb.stats
                                   Compactions
    Level  Files Size(MB) Time(sec) Read(MB) Write(MB)
    --------------------------------------------------

17 result(s) (0.000 sec)
(0.000 sec)

你可以輸 字 h, 然后按回 查看幫助信息.

KV操作

(0.000 sec)
ssdb 127.0.0.1:8888> set one 1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> get one
1
(0.000 sec)
ssdb 127.0.0.1:8888> get two
not_found
(0.000 sec)
ssdb 127.0.0.1:8888> set two 2
ok
(0.000 sec)
ssdb 127.0.0.1:8888> get two
2
(0.000 sec)
ssdb 127.0.0.1:8888> del one
ok
(0.000 sec)
ssdb 127.0.0.1:8888> get one
not_found
(0.000 sec)

hashmap 操作

ssdb 127.0.0.1:8888> hsize hash
0
(0.000 sec)
ssdb 127.0.0.1:8888> hset hash one 1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hset hash two 2
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hsize hash
2
(0.000 sec)
ssdb 127.0.0.1:8888> hset hash three 3
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hsize hash
3
(0.000 sec)
ssdb 127.0.0.1:8888> hget hash one
1
(0.000 sec)
ssdb 127.0.0.1:8888> hdel hash one
1
(0.000 sec)
ssdb 127.0.0.1:8888> hget hash one
not_found
(0.000 sec)
ssdb 127.0.0.1:8888> hscan hash
client_error: wrong number of arguments
(0.000 sec)
ssdb 127.0.0.1:8888> hscan hash "" "" 10
key             value
-------------------------
  three          : 3
  two            : 2
2 result(s) (0.000 sec)
(0.000 sec)
ssdb 127.0.0.1:8888> hclear hash
2
(0.000 sec)
ssdb 127.0.0.1:8888> hscan hash "" "" 10
key             value
-------------------------
0 result(s) (0.000 sec)
(0.000 sec)

zset 操作

ssdb 127.0.0.1:8888> zsize set
0
(0.000 sec)
ssdb 127.0.0.1:8888> zset set one 1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> zset set two 2
ok
(0.000 sec)
ssdb 127.0.0.1:8888> zsize
client_error: wrong number of arguments
(0.000 sec)
ssdb 127.0.0.1:8888> zsize set
2
(0.000 sec)
ssdb 127.0.0.1:8888> zscan set "" "" "" 10
key             value
-------------------------
  one            : 1
  two            : 2
2 result(s) (0.000 sec)

SSDB應(yīng)程序開發(fā)

不同語言的使用方法,文檔http://ssdb.io/docs/zh_cn/clients.html 中都有缰泡,下面介紹一些我會的語言的使用黎烈。

php
<?php
include_once('SSDB.php');
try{
    $ssdb = new SimpleSSDB('127.0.0.1', 8888);
}catch(SSDBException $e){
    die(__LINE__ . ' ' . $e->getMessage());
}
$ret = $ssdb->set('key', 'value');
if($ret === false){
    // error!
}
echo $ssdb->get('key');

和redis使用類似,文檔 http://ssdb.io/docs/zh_cn/php/index.html

golang
package main

import (
        "fmt"
        "os"
        "./ssdb"
       )

func main(){
    ip := "127.0.0.1";
    port := 8888;
    db, err := ssdb.Connect(ip, port);
    if(err != nil){
        os.Exit(1);
    }

    var val interface{};
    db.Set("a", "xxx");
    val, err = db.Get("a");
    fmt.Printf("%s\n", val);
    db.Del("a");
    val, err = db.Get("a");
    fmt.Printf("%s\n", val);

    db.Do("zset", "z", "a", 3);
    db.Do("multi_zset", "z", "b", -2, "c", 5, "d", 3);
    resp, err := db.Do("zrange", "z", 0, 10);
    if err != nil{
        os.Exit(1);
    }
    if len(resp) % 2 != 1{
        fmt.Printf("bad response");
        os.Exit(1);
    }

    fmt.Printf("Status: %s\n", resp[0]);
    for i:=1; i<len(resp); i+=2{
        fmt.Printf("  %s : %3s\n", resp[i], resp[i+1]);
    }
    return;
ruby

gem install ssdb

require "ssdb"
ssdb = SSDB.new
ssdb.set("mykey", "hello world")
# => true

ssdb.get("mykey")
# => "hello world"
ssdb.batch do
  ssdb.set "foo", "5"
  ssdb.get "foo"
  ssdb.incr "foo"
end
python

首先需要加載SSDB模塊匀谣, pip好像有照棋。

from SSDB import SSDB
try:
    pass
    ssdb = SSDB('127.0.0.1', 8888)
except Exception , e:
    pass
    print e
    sys.exit(0)
ssdb.request('set', ['test', '123'])
ssdb.request('get', ['test'])
ssdb.request('incr', ['test', '1'])
ssdb.request('decr', ['test', '1'])
nodejs
var SSDB = require('./SSDB.js');
var ssdb = SSDB.connect(host, port);
ssdb.set('a', new Date(), function(){
    console.log('set a');
});
ssdb.get('a', function(err, val){
    console.log('get a = ' + val);
    ssdb.close();
});

以上都是使用的官方的語言的接口。有一些開發(fā)者武翎,提供了其他的語言接口的模塊烈炭,相比于官方,更貼近語言的常用語法和習(xí)慣宝恶,相對優(yōu)雅符隙。

ssdb 也支持集群多實例,主從復(fù)制等等高級特性都有垫毙。感興趣霹疫,可以研究一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末综芥,一起剝皮案震驚了整個濱河市丽蝎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膀藐,老刑警劉巖屠阻,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異额各,居然都是意外死亡国觉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門虾啦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻诀,“玉大人痕寓,你說我怎么就攤上這事∮眨” “怎么了呻率?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丁眼。 經(jīng)常有香客問我,道長昭殉,這世上最難降的妖魔是什么苞七? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮挪丢,結(jié)果婚禮上蹂风,老公的妹妹穿的比我還像新娘。我一直安慰自己乾蓬,他們只是感情好惠啄,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著任内,像睡著了一般撵渡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上死嗦,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天趋距,我揣著相機與錄音,去河邊找鬼越除。 笑死节腐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摘盆。 我是一名探鬼主播翼雀,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼孩擂!你這毒婦竟也來了狼渊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤类垦,失蹤者是張志新(化名)和其女友劉穎囤锉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體护锤,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡官地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烙懦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驱入。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亏较,到底是詐尸還是另有隱情莺褒,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布雪情,位于F島的核電站遵岩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巡通。R本人自食惡果不足惜尘执,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宴凉。 院中可真熱鬧誊锭,春花似錦、人聲如沸弥锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽籽暇。三九已至温治,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戒悠,已是汗流浹背罐盔。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救崔,地道東北人惶看。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像六孵,于是被迫代替她去往敵國和親纬黎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容