高性能NoSql数据库 SSDB

若与 · · 2106 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


今天在看一个开源项目的时候,发现作者使用一个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 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:若与

查看原文:高性能NoSql数据库 SSDB

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2106 次点击  
加入收藏 微博
1 回复  |  直到 2017-09-23 03:23:32
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传