高性能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# CentOSsudo 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.confecho "ssdb started.";;'stop')kill `cat /usr/local/ssdb/var/ssdb.pid`echo "ssdb stopped.";;'restart')ssdb.confkill `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.5ssdb 127.0.0.1:8888> h# display ssdb-server statusinfo
# escape/do not escape response data: escape yes|no
# export/importexport [-i] out_file-i interactive modeimport in_filesee http://ssdb.io/docs/php/ for commands detailspress 'q' and Enter to quit.ssdb 127.0.0.1:8888> info
version1.9.5
links1
total_calls5
dbsize0
binlogscapacity : 20000000min_seq : 0max_seq : 1
serv_key_rangekv : "" - ""hash: "" - ""zset: "" - ""list: "" - ""
data_key_rangekv : "k" - "k"hash: "" - ""zset: "" - ""list: "" - ""
leveldb.statsCompactionsLevel 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 : 3two : 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 : 1two : 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 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;
ruby
gem install ssdb
require "ssdb"
ssdb = SSDB.new
ssdb.set("mykey", "hello world")
# => truessdb.get("mykey")
# => "hello world"
ssdb.batch dossdb.set "foo", "5"ssdb.get "foo"ssdb.incr "foo"
end
python
首先需要加载SSDB模块, pip好像有。
from SSDB import SSDB
try:passssdb = SSDB('127.0.0.1', 8888)
except Exception , e:passprint esys.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 也支持集群多实例,主从复制等等高级特性都有。感兴趣,可以研究一下。
相关文章:

System.Transactions介绍
在.Net Framework 2.0中,新增了一个名称空间:System.Transactions。从其名字就可以看出来,里面包含了Transaction相关的类。System.Transactions提供了一个“轻量级”的、易于使用的Transaction框架。 在以前,要实现Transaction需…

Compression Helper Class using SharpZipLib
使用 SharpZipLib 进行压缩的辅助类,简化压缩字节数组和字符串的操作。 usingSystem;usingSystem.Text;usingSystem.IO;usingICSharpCode.SharpZipLib.BZip2;usingICSharpCode.SharpZipLib.GZip;usingICSharpCode.SharpZipLib.Zip;namespaceCompression{ /**////…

matlab 线模式密度,环形腔窄线宽光纤激光器的研究
河北工业大学硕士2016环形腔窄线宽光纤激光器的研究Studt on Circular Cavity Fiber Laser with Narrow Line-width Output翟增武康志龙集成电路工程(专业学位)光纤激光器的主要特点就是指以光纤作为谐振腔的同时充当着光波导的角色。相比于气体激光器、固体激光器等其他的激光…

sql server 查看对象最后修改时间
sql server 查看对象最后修改时间,根据最后修改时间排序 存储过程 SELECT * FROM sys.all_objects WHERE TYPEP ORDER BY modify_date DESC; 视图 SELECT * FROM sys.all_objects WHERE TYPEv ORDER BY modify_date DESC; 表 SELECT * FROM sys.all_objects WHERE…

AI一分钟 | 比特大陆递交招股书,募资用于AI芯片研发;泰晤士2019全球大学排行榜:清华列亚洲第一...
▌比特大陆递交招股书,募资用于 AI 芯片研发9 月 26 日晚,比特大陆于香港联交所上载 A1 招股书,启动上市计划。中金为独家保荐人,搜狗创始人王小川担任其独立非执行董事。在招股书中,比特大陆称自身为中国第二大无晶圆…
php日志接入rsyslog,rsyslog和在PHP上的应用
rsyslog配置rsyslog的配置文件为/etc/rsyslog.conf,但真正的配置放在/etc/rsyslog.d/目录下# Default rules for rsyslog.## For more information see rsyslog.conf(5) and /etc/rsyslog.conf## First some standard log files. Log by facility.#auth,authpriv.* …

特斯拉“国王”王权不保
作者 | Just出品 | AI科技大本营(公众号ID:rgznai100)中国有句古话,“偷鸡不成蚀把米”。发推一时爽,本就麻烦缠身的马斯克不会想到,8 月 7 日那条考虑要将特斯拉私有化的推文,让他陷入了更大的…

流水账(4)---礼拜二---“抗议,我不是电工!”
礼拜二,今天。 6点半起床,9点钟到东郊。 上午帮东郊重装一台电脑。郁闷,我在那边一直就被当作修电脑的工人用了。还想起一个很有意思的误会。 一次,我和老师说,你知道罢,东郊还有一个fudan的法硕在那…

Python--1 初识
1.1 Python简介 Python[1] (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,python的创始人为吉多范罗苏姆(Guido van Rossum),Python是著名的“龟叔”Gui…

php 485串口通信,485串口通信中的常见问题
通信距离485总线的通讯距离理论可以达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常.所以通常485总线实际的稳定的通讯距离远远达不到1200米. 负载485设备多,线材阻抗不合乎标准,线径…

人工智能加“医真云”,每年让5700万人告别误诊
“去拍个片子吧。”这是去医院看病常常能听到的话。现代医学诊断越来越倚重影像,专业医疗科学网站估计:医疗数据中有超过90%的数据来自于医学影像。然而,即便设备产生了高精度的大量影像,针对这些数据的分析,现在主要还…

关于Iframe之间以及与父窗体的值传递
自己实现过了的,javascript脚本关于Iframe之间以及与父窗体的值传递,事件调用问题; 在父页面访问Iframe子窗体的txtAddress控件window.frames["ifrMapCompanyDetails"].document.all("txtAddress").value 地址 ; 在Iframe子窗体1访问父页面的TextBox1控…

Php将网站推送到手机桌面的方法,把网页发送到桌面代码
把网页发送到桌面相信很多站长都会用到,可有的站长可能不会写,今天碎碎就给大家分享下把网页发送到桌面php和asp良种语言的代码。首先我们先做准备工作,要先上传自己网站的ioc文件,这样发送到桌面的时候才会有图标显示。然后新建一…
如何设计 Web App 应用架构?「两分钟了解 IOING」
IOING 在做些什么? IOING 在你的代码和浏览器之间架设了一个中间解释层,该解释层提供了一套新的语法来填补浏览器所不具备的能力。 SPA 开发痛点 开发一个 SPA 应用的痛点是不同模块页面的状态保存,当从一个页面跳转到另一个页面的时候窗口的…

ICLR 2019论文投稿近1600篇,强化学习最热门
作者 | 非主流出品 | AI科技大本营(公众号ID:rgznai100)ICLR 2019 的论文提交已经截止。根据官方消息,本届大会共收到近 1600 篇投稿,相比 ICLR 2018 的 935 篇,以及 ICLR 2017 的 490 篇,几乎每…

[Java]学习Java(4)类、接口、语句
1)类多了包的概念2)类继承时与C++不同,它可以将父类protected的函数重写为public的。3)接口、纯虚函数概念都差不多,语法为:public class A extends B implements IC,ID,IE { ...}4)语句:与C+&a…

php easyui tree 结构,EasyUI Tree树组件无限循环的解决方法
在学习jquery easyui的tree组件的时候,在url为链接地址的时,发现如果最后一个节点的state为closed时,未节点显示为文件夹,单击会重新加载动态(Url:链接地址)形成无限循环。如:tree.json[{"id":1,"text&…

Scikit-learn 发布 0.20版本!新增处理缺失值、合并Pandas等亮点功能
整理 | Jane出品 | AI科技大本营之前一直预告 Scikit-learn 的新版本会在 9 月发布,在马上就要结束的 9 月,我们终于迎来了 Scikit-learn 0.20。此版本修复了大量的错误和功能,增强了 Scikit-learn 库,改善了文档和示例。在此对 …

深挖数据价值 阿里云栖开年大会报道
本文讲的是深挖数据价值 阿里云栖开年大会报道【IT168 云计算】经历风雨,转身看到彩虹。在这个“化云为雨”的时节,造云大咖们角色扮演也逐步渐入佳境,或随需而动,或引领潮流。阿里云作为国内公有云绝对的大咖之一,正以…

使用Facade模式分析
在遇到以下情况时可以考虑使用Facade模式:1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不…

我与前端之间不得不说的三天两夜之javaScript
前端基础之JavaScriptJavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套…

难以置信!LSTM和GRU的解析从未如此清晰(动图+视频)
作者 | Michael Nguyen编译 | 蔡志兴、费棋编辑 | Jane出品 | AI科技大本营【导语】机器学习工程师 Michael Nguyen 在其博文中发布了关于 LSTM 和 GRU 的详细图解指南。博文中,他先介绍了 LSTM 和 GRU 的本质, 然后解释了让 LSTM 和 GRU 有良好表现的内…

php 开发restful api,用PHP创建RESTful API?
如果您的服务支持所有CRUD操作,则始终建议实现RESTful接口.这样做并不是很难.我已经概述了下面的一些基础知识.RESTful服务只是做了一些事情:>它使用HTTP请求方法进行CRUD操作的通信>它使用HTTP状态代码来传达响应状态,以及>它使用URI来定义您的资源(您正在…

MySQL服务器的配置教程
1、安装MySQL 这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面我们来讲讲配置。 2、配置MySQL 注意,在Ubuntu下MySQL缺省是只允许本地访问的,如果你要其他机器也能够访问的话&am…

php开发我的世界插件,WorldEdit/开发与API
本页面已存在其他语言的内容,请协助翻译为本地化的中文。点击此处开始翻译。如本模板出现在原文存档页面,请注意更新主页面后,仍需要去除此处该模板如当前页面已经没有需要翻译的内容,请删去待翻译模板有标题的大篇幅文章…

关于AI,腾讯又有大动作!开发者该如何应对?
时隔 6 年后,腾讯公司的组织架构迎来新一轮的优化调整,在原有七大事业群(BG)的基础上进行重组整合。 腾讯公司董事会主席兼首席执行官马化腾表示:“作为一家以互联网为基础的科技和文化公司,技术是腾讯公司…

Android存储方式之SQLite
前言 SQLite数据库操作在Android开发中非常常用今天我将带大家全面了解关于SQLite数据库的操作(增、删、查、改)目录 1. SQLite数据库介绍 SQLite是Android内置的一个小型、关系型、属于文本型的数据库。 > Android提供了对 SQLite数据库的完全支持&a…

最近要换个主机,现在的太慢了
最近在学习wtl,打算做一个文件搜索工具来练手,需要正则表达式处理、数据库存储、键盘HOOK以及UI等技术UI用WTL搞定正则表达式的处理:http://research.microsoft.com/projects/greta/regex_perf.htmlhttp://www.tropicsoft.com/Components/Reg…

oracle数据库配置失败,oracle11g – Oracle 11G XE安装错误:数据库配置失败
在linuxMint上安装后运行oracle配置时:/etc/init.d/oracle-xe configure指定以下错误:sudo /etc/init.d/oracle-xe configureOracle Database 11g Express Edition Configuration-------------------------------------------------This will configure …