這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今天在看一個開源項目的時候,發現作者使用一個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 也支援叢集多執行個體,主從複製等等進階特性都有。感興趣,可以研究一下。