今天在看一個開源項目的時候蹲缠,發(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)閉了.
使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ù)制等等高級特性都有垫毙。感興趣霹疫,可以研究一下。