高性能NoSql数据库 SSDB

作者: 若与 | 来源:发表于2017-09-22 00:25 被阅读125次

    今天在看一个开源项目的时候,发现作者使用一个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

        本文链接:https://www.haomeiwen.com/subject/yxrxextx.html