高性能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.zipunzip mastercd ssdb-mastermake# 将安装在 /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 directorymake[1]: *** [all] Error 1或者g++ ...deps/jemalloc-3.3.1/lib/libjemalloc.a: No such file or directorymake[1]: *** [all] Error 1这是因为 Snappy 或者 Jemalloc 没有编译成功, 这一般是因为你的系统时钟有问题. 可以这样解决:cd deps/snappy-1.1.0autoreconf --force --install./configuremake或者cd deps/jemalloc-3.3.1autoreconf --force --install./configuremake启动和停止# 启动主库, 此命令会阻塞住命令行./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 instanceconfigs=/data/ssdb_data/test/ssdb.conf将 /data/ssdb_data/test/ssdb.conf 修改为你的 SSDB 配置文件的路径. 如果你有多个 SSDB 实例, 那么把它们写在一行, 用空格来分隔, 例如:# each config file for one instanceconfigs=/data/ssdb_data/test/ssdb.conf /data/ssdb_data/demo/ssdb.conf# CentOSsudo chkconfig --add ssdbsudo chkconfig ssdb on# Ubuntusudo chmod a+x /etc/init.d/ssdbsudo update-rc.d ssdb defaultsSSDB 默认安装在 /usr/local/ssdb 录下. ssdb-server 是服务器的程序, ssdb-cli 是命令 客户端.在使 带的 ssdb.conf 配置 件时, SSDB 成的 志 件按体积进 分割, 仅此 已. 所 以, 你需要编写 的 crontab 进 志压缩和定期清理.如果出现服务器掉电, kernel panic 等系统故障, 在系统重新启动之后, 你需要 动删除 ssdb 的 PID 件 ssdb.pid, 然后才能启动 ssdb-server.另外, 你可以参考下 的做法, 在系统启动和关机时, 启动和关闭 ssdb-server:#!/bin/shcase "$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 8888ssdb (cli) - ssdb command line tool.Copyright (c) 2012-2016 ssdb.io'h' or 'help' for help, 'q' to quit.ssdb-server 1.9.5ssdb 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_filesee http://ssdb.io/docs/php/ for commands detailspress 'q' and Enter to quit.ssdb 127.0.0.1:8888> infoversion 1.9.5links 1total_calls 5dbsize 0binlogs capacity : 20000000 min_seq : 0 max_seq : 1serv_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 1ok(0.000 sec)ssdb 127.0.0.1:8888> get one1(0.000 sec)ssdb 127.0.0.1:8888> get twonot_found(0.000 sec)ssdb 127.0.0.1:8888> set two 2ok(0.000 sec)ssdb 127.0.0.1:8888> get two2(0.000 sec)ssdb 127.0.0.1:8888> del oneok(0.000 sec)ssdb 127.0.0.1:8888> get onenot_found(0.000 sec)hashmap 操作ssdb 127.0.0.1:8888> hsize hash0(0.000 sec)ssdb 127.0.0.1:8888> hset hash one 1ok(0.000 sec)ssdb 127.0.0.1:8888> hset hash two 2ok(0.000 sec)ssdb 127.0.0.1:8888> hsize hash2(0.000 sec)ssdb 127.0.0.1:8888> hset hash three 3ok(0.000 sec)ssdb 127.0.0.1:8888> hsize hash3(0.000 sec)ssdb 127.0.0.1:8888> hget hash one1(0.000 sec)ssdb 127.0.0.1:8888> hdel hash one1(0.000 sec)ssdb 127.0.0.1:8888> hget hash onenot_found(0.000 sec)ssdb 127.0.0.1:8888> hscan hashclient_error: wrong number of arguments(0.000 sec)ssdb 127.0.0.1:8888> hscan hash "" "" 10key value------------------------- three : 3 two : 22 result(s) (0.000 sec)(0.000 sec)ssdb 127.0.0.1:8888> hclear hash2(0.000 sec)ssdb 127.0.0.1:8888> hscan hash "" "" 10key value-------------------------0 result(s) (0.000 sec)(0.000 sec)zset 操作ssdb 127.0.0.1:8888> zsize set0(0.000 sec)ssdb 127.0.0.1:8888> zset set one 1ok(0.000 sec)ssdb 127.0.0.1:8888> zset set two 2ok(0.000 sec)ssdb 127.0.0.1:8888> zsizeclient_error: wrong number of arguments(0.000 sec)ssdb 127.0.0.1:8888> zsize set2(0.000 sec)ssdb 127.0.0.1:8888> zscan set "" "" "" 10key value------------------------- one : 1 two : 22 result(s) (0.000 sec)SSDB应程序开发不同语言的使用方法,文档http://ssdb.io/docs/zh_cn/clients.html 中都有,下面介绍一些我会的语言的使用。php<?phpinclude_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.htmlgolangpackage mainimport ( "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;rubygem install ssdbrequire "ssdb"ssdb = SSDB.newssdb.set("mykey", "hello world")# => truessdb.get("mykey")# => "hello world"ssdb.batch do ssdb.set "foo", "5" ssdb.get "foo" ssdb.incr "foo"endpython首先需要加载SSDB模块, pip好像有。from SSDB import SSDBtry: 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'])nodejsvar 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 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。