高效能NoSql資料庫 SSDB

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

今天在看一個開源項目的時候,發現作者使用一個ssdb的資料庫,第一反應是ssd硬碟,當時很詫異。後面瞭解後才知道,原來是 nosql資料庫。

ssdb介紹

一個高效能的支援豐富資料結構的 NoSQL 資料庫, 用於替代 Redis.
SSDB 是一個 C/C++ 語言開發的高效能 NoSQL 資料庫, 支援 KV, list, map(hash), zset(sorted set) 等資料結構, 用來替代或者與 Redis 配合儲存十億層級列表的資料.SSDB 具有和 Redis 相似的 API, 持的用戶端包括: PHP, C++, Python, Java, Lua, Ruby, Nodejs, etc.

SSDB 是穩定的, 生產環境使用的, 已經在許多互連網公司得到廣泛使用, 如奇虎 360, TOPGAME.

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

下載安裝

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

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

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

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

如果出現如下錯誤:

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

或者

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

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

cd deps/snappy-1.1.0autoreconf --force --install./configuremake

或者

cd deps/jemalloc-3.3.1autoreconf --force --install./configuremake

啟動和停止

# 啟動主庫, 此命令會阻塞住命令列./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 進程, 如果你希望在作業系統啟動和停止時自動地管理, 請按下面的說明進行.

SSDB 啟動指令碼(隨作業系統自啟動)
假設你已經安裝 SSDB 在預設的 /usr/local/ssdb 目錄, 把 tools/ssdb.sh 指令碼放到 /etc/init.d 目錄下.注意: 對於 CentOS 使用者, 請將 ssdb.sh 重新命名為 ssdb.編輯下面的內容:# each config file for one instanceconfigs=/data/ssdb_data/test/ssdb.conf將 /data/ssdb_data/test/ssdb.conf 修改為你的 SSDB 設定檔的路徑. 如果你有多個 SSDB 執行個體, 那麼把它們寫在一行, 用空格來分隔, 例如:# each config file for one instanceconfigs=/data/ssdb_data/test/ssdb.conf /data/ssdb_data/demo/ssdb.conf# CentOSsudo chkconfig --add ssdbsudo chkconfig ssdb on# Ubuntusudo chmod a+x /etc/init.d/ssdbsudo update-rc.d ssdb defaults

SSDB 預設安裝在 /usr/local/ssdb 錄下. ssdb-server 是伺服器的程式, ssdb-cli 是命令 用戶端.
在使 帶的 ssdb.conf 配置 件時, SSDB 成的 志 件按體積進 分割, 僅此 已. 所 以, 你需要編寫 的 crontab 進 志壓縮和定期清理.
如果出現伺服器掉電, kernel panic 等系統故障, 在系統重新啟動之後, 你需要 動刪除 ssdb 的 PID 件 ssdb.pid, 然後才能啟動 ssdb-server.
另外, 你可以參考下 的做法, 在系統啟動和關機時, 啟動和關閉 ssdb-server:

#!/bin/shcase "$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 許可權), 然後執 : chmod ugo+x /etc/init.d/ssdb.sh
這樣, ssdb-server 就可以隨著作業系統啟動和關閉了.


架構

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

SSDB 的命令 用戶端 ssdb-cli 可 於 常管理, 包括查看 SSDB 的運 狀態(info), 還能做 些 API 沒有的操作, 如清空整個資料庫.
運 ssdb-cli 串連到 127.0.0.1:8888,

youdi@liangchangyoudeMacBook-Pro  ~/OtherProject/ssdb-master/tools  ./ssdb-cli -p 8888ssdb (cli) - ssdb command line tool.Copyright (c) 2012-2016 ssdb.io'h' or 'help' for help, 'q' to quit.ssdb-server 1.9.5ssdb 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_filesee http://ssdb.io/docs/php/ for commands detailspress 'q' and Enter to quit.ssdb 127.0.0.1:8888> infoversion    1.9.5links    1total_calls    5dbsize    0binlogs        capacity : 20000000        min_seq  : 0        max_seq  : 1serv_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 1ok(0.000 sec)ssdb 127.0.0.1:8888> get one1(0.000 sec)ssdb 127.0.0.1:8888> get twonot_found(0.000 sec)ssdb 127.0.0.1:8888> set two 2ok(0.000 sec)ssdb 127.0.0.1:8888> get two2(0.000 sec)ssdb 127.0.0.1:8888> del oneok(0.000 sec)ssdb 127.0.0.1:8888> get onenot_found(0.000 sec)

hashmap 操作

ssdb 127.0.0.1:8888> hsize hash0(0.000 sec)ssdb 127.0.0.1:8888> hset hash one 1ok(0.000 sec)ssdb 127.0.0.1:8888> hset hash two 2ok(0.000 sec)ssdb 127.0.0.1:8888> hsize hash2(0.000 sec)ssdb 127.0.0.1:8888> hset hash three 3ok(0.000 sec)ssdb 127.0.0.1:8888> hsize hash3(0.000 sec)ssdb 127.0.0.1:8888> hget hash one1(0.000 sec)ssdb 127.0.0.1:8888> hdel hash one1(0.000 sec)ssdb 127.0.0.1:8888> hget hash onenot_found(0.000 sec)ssdb 127.0.0.1:8888> hscan hashclient_error: wrong number of arguments(0.000 sec)ssdb 127.0.0.1:8888> hscan hash "" "" 10key             value-------------------------  three          : 3  two            : 22 result(s) (0.000 sec)(0.000 sec)ssdb 127.0.0.1:8888> hclear hash2(0.000 sec)ssdb 127.0.0.1:8888> hscan hash "" "" 10key             value-------------------------0 result(s) (0.000 sec)(0.000 sec)

zset 操作

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

SSDB應程式開發

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

php
<?phpinclude_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 mainimport (        "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.newssdb.set("mykey", "hello world")# => truessdb.get("mykey")# => "hello world"ssdb.batch do  ssdb.set "foo", "5"  ssdb.get "foo"  ssdb.incr "foo"end
python

首先需要載入SSDB模組, pip好像有。

from SSDB import SSDBtry:    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();});

以上都是使用的官方的語言的介面。有一些開發人員,提供了其他的語言介面的模組,相比於官方,更貼近語言的常用文法和習慣,相對優雅。

ssdb 也支援叢集多執行個體,主從複製等等進階特性都有。感興趣,可以研究一下。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.