高性能NoSql数据库 SSDB

今天在看一个开源项目的时候,发现作者使用一个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.zip
unzip master
cd ssdb-master
make
# 将安装在 /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 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 没有编译成功, 这一般是因为你的系统时钟有问题. 可以这样解决:

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 进程, 如果你希望在操作系统启动和停止时自动地管理, 请按下面的说明进行.

SSDB 启动脚本(随操作系统自启动)
假设你已经安装 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:

#!/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,

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应程序开发

不同语言的使用方法,文档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();
});

以上都是使用的官方的语言的接口。有一些开发者,提供了其他的语言接口的模块,相比于官方,更贴近语言的常用语法和习惯,相对优雅。

ssdb 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容