前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高性能NoSql数据库 SSDB

高性能NoSql数据库 SSDB

作者头像
若与
发布2018-04-25 12:36:36
2K0
发布2018-04-25 12:36:36
举报

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

代码语言: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 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.09.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ssdb介绍
    • 下载安装
      • 编译和安装
      • 问题解决
    • 启动和停止
      • SSDB 启动脚本(随操作系统自启动)
    • 使SSDB命令客户端(ssdb-cli)
      • KV操作
        • hashmap 操作
          • zset 操作
            • SSDB应程序开发
              • php
              • golang
              • ruby
              • python
              • nodejs
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档