SSDB

SSDB 是一个 C/C++ 语言开发的高性能 NoSQL 数据库, 支持 zset(sorted set), map(hash), kv, list 等数据结构, 用来替代或者与 Redis 配合存储十亿级别的列表数据. SSDB 同时也被国内外业界的众多互联网企业所使用, 如 QIHU 360, TOPGAME, 汽车之家, 比亚迪等.

项目主页: https://github.com/ideawu/ssdb
SSDB 文档: http://ssdb.io/docs/zh_cn/
谁在用 SSDB: http://ssdb.io/docs/zh_cn/users.html
官方QQ群: 170983373

2014开源中国开源世界高峰论坛, 中国开源优秀项目奖项目

SSDB 的主要特点:

  • 支持 zset, map/hash, list, kv 数据结构, 可替代 Redis
  • 特别适合存储大量集合数据, 支持丰富的数据结构: key-value, key-map, key-zset, key-list.
  • 使用 Google LevelDB 作为存储引擎
  • 支持主从同步, 多主同步
  • 客户端支持 PHP, C++, Python, Lua, Java, Ruby, nodejs, Go 等
  • 内存占用极少
  • 图形化界面管理工具(phpssdbadmin)

PHP API

<?php
require_once('SSDB.php');
$ssdb = new SimpleSSDB('127.0.0.1', 8888);
$resp = $ssdb->set('key', '123');
$resp = $ssdb->get('key');
echo $resp; // output: 123

PHP API 文档: http://ssdb.io/docs/zh_cn/php/

SSDB vs Redis

SSDB vs Redis

SSDB 架构

Views: 157846

433 Responses to "SSDB"

  • ideawu: 我之前在微博问过你问题,没法上QQ,在这里请教了。我的ssdb部署的双主多从,其中有一个大的集合:使用的 hset(String name, String key, String val) 写入的数据,name 固定为 "SSDBMAP",key 是编号,value是json。

    出现的问题是:新增从库或主库的时候,"SSDBMAP"的数据没有全部同步过去,实际 hsize 结果为 14W,但是新增的 ssdb 服务却只有几十条。

    请问,是我的这个map设计有问题吗? 请指教,多谢。 Reply
    @张衡Henry: 这个设计没有直接问题. 你说hsize=14w, 是在主库上查询, 还是在从库上查询? 还有, 你的ssdb版本是多少? Reply
    @ideawu: 14W 是在主库上,这个部署的比较早,版本是 1.6.7, 我最近又新部署了一个主和一个从,版本是 1.6.8.4, 会是版本不同的问题吗? Reply
    @张衡Henry: 因为你是很久以前的老版本, 升级之后, 你需要把从库上的 meta/ 目录删除, 然后重启从库. Reply
    @张衡Henry: 我有了一个解决方案:扩展的服务上,手动拷贝完整的 data/ 和 meta/,这样就正常了,难道扩展的服务器第一次同步不是同步全量吗?

    还有请教下,如果双主之间的数据不一致,镜像策略是啥呢? Reply
  • 你好,SSDB的驱动是使用stream_socket_client 打开socket 连接,请问性能怎样,考虑了出个php C 扩展的模块API 吗, 像 phpredis 。 Reply
  • 请教如何实现原子的HSETNX Reply
  • 博主好,incr 和 hincr 是原子性操作吗? 因为看到博主说到“SSDB没有事务跟锁的概念” Reply
    @hhh: 是原子操作. 原子操作和事务没有任何必要的联系. Reply
  • 提几个redis里支持但ssdb不支持的,希望能增加:
    .keys * 最好还能支持正则
    .flushdb/expire/persist/zcount
    *redis只支持srandmember,ssdb可以考虑实现srandmember/zrandmember/hrandmember
    *ssdb的exists是专门用于kv的,而redis的exists的是通用的,ssdb这么设计的理由是?
    .订阅功能
    .分库select要能实现最好 Reply
    @sai: Hi, 谢谢你的反馈. 这些功能点因为架构和时间的原因(主要是前者), ssdb 并没有支持. 欢迎大家一起改进.

    对于 exists 命令, 因为 ssdb 的数据是分数据类型的, 而且不同的数据类型在硬盘上是分开存储(使用者可不关心), 所以不同的数据类型是可以重名的. 因此, exists 只针对 kv 数据结构, 而 hsize, zsize 可用来判断 map/zset 是否存在. Reply
  • SSDB有Perl接口吗? Reply
    @david: 没有. 你可以看看 Redis 有没有 Perl 接口, 可以直接用于 SSDB. Reply
  • hi:

    看了你之前质疑leveldb的多路归并算法的文章,我通过日志观察,发现leveldb一次最多归并68个文件(通过在NewMergingIterator中打印n_值),并结合客户端日志,发现leveldb每次停顿时长最大间隔就是归并文件数达到68个时候,是否考虑在此进行下优化,通过堆排序或者败者数提升性能?

    在数量不是很大时,堆排序和败者树(胜者树)那个性能又更好些?

    谢谢! Reply
  • @ideawu:
    ssdb 插入记录数量总数怎么查看呢? Reply
    @cityhunter: Hi, 如果有这样的需求, 而且数据是 KV, 可以考虑用 hash(map) 来替代 KV. 如果是想统计 hash 容器或者 zset 容器的数量, 就不支持了. Reply
  • 对了,客户端调用的插入数据语句为:ssdb.request(‘multi_set’,params)

    谢谢! Reply
  • 报错代码应该是 ssdb.py 文中 request 函数中的return 语句中
    if len(resp)==0:
    pass
    —– return SSDB_Response(‘disconnected’,’Connection closed’) ——– Reply
    @beng_jun: 这个时候, 服务器的 log.txt 有什么异常输出吗? 把 log 级别设为 debug 看看. Reply
    @ideawu:
    1、客户端报disconnected错的原因已经找到了,应该是nfile参数值小的原因,已经调大,通过昨晚一晚上测试,未发生异常。

    2、停顿这个问题,导入10亿条记录之后,特别明显。我这边需求是写比读多,要求快速的写入,同时能提供少量的读(相比写入),一天数据就有10亿多条,但是一天查询不到100万次,建多个实例并参考你的双主模式,但建的太多,耗内存,维护也有点麻烦,请问你有什么好的建议?

    3、leveldb 1.45 改进mmap,提高了ext4下同步写入速度,建议升级ssdb,进一步提升性能。

    谢谢!

    谢谢! Reply
    @beng_jun: 你们一天写入10亿多条, 是比较平均的写吗? 还是有要求例如要在一个小时内导完之类的. 我会保持更新 leveldb 的最新版本. Reply
    @ideawu: 数据是实时写,并提供实时查询,在线数据要保存至少7个月。现在数据全部在ORACLE数据库中,数据入库已经成为瓶颈,目前正计划找替代方案,hbase有点重量级暂不考虑,ssdb很轻量级我感觉挺适合的,但是要保存7个月数据,而且当月数据存在更新可能(一般不会,除非数据错了),如何合理规划是个问题,不过其实我最担心的就是停顿会影响查询,查询虽然不多,但很重要,不能查询或者查询慢都将有投诉,所以想听听你的想法? Reply
    @beng_jun: 这种情况你可以部署主从架构, 所有查询在从库上进行.
    @ideawu: 经过反复重现错误,对比log.txt日志,确定log.txt中报错信息就仅有 [INFO ] ssdb-server.cpp(157): fd: 16 error, delete link 一行错误。这行信息只有报错时出现,正常时没有。 Reply
    @ideawu: 对应的时间点只有 [INFO ] ssdb-server.cpp(157): fd: 10 error, delete link Reply
    @ideawu: 已经设置为debug,问题也重现了,但客户端报disconnected异常的时候,对比日志,服务端log.txt对应的时间点并没有什么异常日志,debug模式下也没有错误日志。 Reply

« [11][12][13][14][15][16][17][18][19] » 16/19

Leave a Comment