今天在看一个开源项目的时候,发现作者使用一个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上安装。
编译和安装
代码语言:javascript复制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 目录下, 可以这样
代码语言:javascript复制sudo make install PREFIX=/your/direcotry
问题解决
如果出现如下错误:
代码语言:javascript复制g ...deps/snappy-1.1.0/.libs/libsnappy.a: No such file or directory
make[1]: *** [all] Error 1
或者
代码语言:javascript复制g ...deps/jemalloc-3.3.1/lib/libjemalloc.a: No such file or directory
make[1]: *** [all] Error 1
这是因为 Snappy 或者 Jemalloc 没有编译成功, 这一般是因为你的系统时钟有问题. 可以这样解决:
代码语言:javascript复制cd deps/snappy-1.1.0
autoreconf --force --install
./configure
make
或者
代码语言:javascript复制cd deps/jemalloc-3.3.1
autoreconf --force --install
./configure
make
启动和停止
代码语言:javascript复制# 启动主库, 此命令会阻塞住命令行
./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 启动脚本(随操作系统自启动)
代码语言:javascript复制假设你已经安装 SSDB 在默认的 /usr/local/ssdb 目录, 把 tools/ssdb.sh 脚本放到 /etc/init.d 目录下.
注意: 对于 CentOS 用户, 请将 ssdb.sh 重命名为 ssdb.
编辑下面的内容:
# 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 是服务器的程序, ssdb-cli 是命令 客户端. 在使 带的 ssdb.conf 配置 件时, SSDB 成的 志 件按体积进 分割, 仅此 已. 所 以, 你需要编写 的 crontab 进 志压缩和定期清理. 如果出现服务器掉电, kernel panic 等系统故障, 在系统重新启动之后, 你需要 动删除 ssdb 的 PID 件 ssdb.pid, 然后才能启动 ssdb-server. 另外, 你可以参考下 的做法, 在系统启动和关机时, 启动和关闭 ssdb-server:
代码语言:javascript复制#!/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 权限), 然后执 : 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,
代码语言:javascript复制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操作
代码语言:javascript复制(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 操作
代码语言:javascript复制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 操作
代码语言:javascript复制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应程序开发
不同语言的使用方法,文档http://ssdb.io/docs/zh_cn/clients.html
中都有,下面介绍一些我会的语言的使用。
php
代码语言:javascript复制<?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
代码语言:javascript复制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("%sn", val);
db.Del("a");
val, err = db.Get("a");
fmt.Printf("%sn", 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: %sn", resp[0]);
for i:=1; i<len(resp); i =2{
fmt.Printf(" %s : %3sn", resp[i], resp[i 1]);
}
return;
ruby
gem install ssdb
代码语言:javascript复制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好像有。
代码语言:javascript复制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
代码语言:javascript复制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 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。