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: 109305

421 Responses to "SSDB"

  • 博主,您好!这里有个问题想请教下,是有关zset容器中zrank和zrange操作的性能的。
    我在测试SSDB的zset的性能时,发现其zrank和zrange的性能并不好。
    经测试,发现zrank和zrange的时间复杂度为O(n),即性能与容器中key数量有关,
    但其实这个复杂度是可以优化到O(logn)的,到底是我用的接口有问题,还是目前
    的SSDB没有实现zrank和zrange的O(logn)的算法?毕竟zset最主要的用途就是获取
    和排名有关的信息,所以这块的算法优化还是很重要的。希望博主能解答下,谢谢! Reply
    @asdfping: 我做了一个排行榜的实现,几乎是性能与key数量无关的,不过我没有开源,你只能在我的服务器上在线测试一下。 Reply
    @asdfping: 你说的没错, zrank 和 zrange 复杂度是 O(n), 这个 ssdb 无法改进. 你可以换种思路来实现你的功能, 例如, 如缓存最重要的 top 100 排行榜. Reply
    @ideawu: 哦,那就是说我的理解没错了,还以为是测试方法的问题。关于排行这块的话我再另想办法优化吧。 Reply
    @asdfping: ssdb 确实有这个问题,其实是 leveldb的问题;
    看redis 上 skiplist ,每个level到下个有个步长,可以直接计算 排序的问题。
    leveldb就没看到, 真想加一个!! Reply
  • 这个benchmark的结果有几个问题问一下作者:

    1)有具体配置吗?(主要是硬件配置特别是是否有SSD)

    2)直观告诉我比较基于内存的redis,ssdb和redis性能应该差距很大即使是ssdb用上了SSD,除非数据不够很多时候都走了缓存或者有一些别的瓶颈。

    3) 是用的ssdb-bench比较redis和ssdb吗?我用ssdb-bench (最新的github代码)刚才测试redis 3.03的时候set失败 (无具体出错信息),还没有查看代码哪儿的问题。

    多谢。 Reply
  • 博主,您好!请问SSDB的官方API支持异步访问吗?从目前我看的官方API来看,似乎只有同步的访问方式。虽然在cpp客户端有异步的API,但那个第三方的所谓的异步API,其实还是封装了官方的同步访问的API,感觉并没有真正实现异步,这里可否探讨下? Reply
    @asdfping: 官方的api没有异步接口. 说实话, 所谓的异步只是编程语言的语法糖和库封装, 你也可以自己封装. Reply
    @ideawu:
    好的,谢谢!现在通过修改官方的api,初步实现了异步,确实可以的。 Reply
    @asdfping:你是怎么改的呢 我们也想用通知模式 而不是轮询 Reply
    @呱呱: 官方api都是采用同步阻塞的方式访问SSDB,我这边将同步方式中的两个过程:即发送命令和接收数据分拆为两个异步接口,然后采用主循环,不断地判断是否有数据接收。有点像这样:
    while(true)
    {
    send(cmd); //发命令
    Event();//判断是否有数据接收,这里面的过程是非阻塞的。
    }
    其中发送命令和接收数据的逻辑作者都写好了,把这个逻辑理一下,改为非阻塞接口,就差不多了。当然这个过程还不是太完善,我也是刚刚学习这种做法,有更好的方法可以交流下。 Reply
    @asdfping: “即发送命令和接收数据分拆为两个异步接口,然后采用主循环,不断地判断是否有数据接收。” 这样岂不是要不停的轮询,性能如何呢?可不可以做到有数据来才返回那种呢,那种也是可以异步的,不过不是立即返回,有个长等待的过程~
  • 请问何时支持非key-value类型数据写入可以设置超时时间?
    不知道现在是不是已经支持了,自动超时机制在应用中很重要。 Reply
  • 请教下有和redis相关的优劣对比介绍么 Reply
  • 搭建phpssdbadmin,访问index.php,报错:
    No route for index.php!

    F:\ssdb\phpssdbadmin\iphp\framework\App.php:95 route()
    F:\ssdb\phpssdbadmin\iphp\framework\App.php:47 execute()
    F:\ssdb\phpssdbadmin\index.php:9 run()


    Copyright©2014 ideawu. All rights reserved. 3.00 ms

    请问这个route()函数哪里的;我的ssdb配在本地(127.0.0.1),操作系统是win7;
    这个错误要如何解决?另外登陆的user和password还需要设置吗?应该怎样设置? Reply
    @zhangyong: 需要按这上面的文档, 配置apache/nginx: https://github.com/ssdb/phpssdbadmin 如果还有问题, 请在上面的链接里面讨论. Reply
    @ideawu: 您好!在nginx+php下,在nginx的配置除了加入重定向以外,还需要加入别的配置语句吗?按照文档说明,只加入了重定向,访问index.php报404错误(通过nginx访问index.html是可以的,我的nginx版本是1.9.2,php版本是5.6.0) Reply
    @zhangyong: 除了文档所说的, 不需要其它的设置. 请在上面的网址提供更详细的信息. Reply
    @ideawu: 把phpssdnadmin下的index,改成<?php
    phpinfo();
    ?>可以正确显示;

    如果沿用原来的内容,页面上显示
    No route for index.php!

    F:\ssdb\phpssdbadmin\iphp\framework\App.php:95 route()
    F:\ssdb\phpssdbadmin\iphp\framework\App.php:47 execute()
    F:\ssdb\phpssdbadmin\index.php:9 run()
    Copyright©2014 ideawu. All rights reserved. 11.00 ms

    nginx下的log显示错误如下:

    我的nginx改了8000端口,没用80端口。nginx在c盘,phpssdbadmin在f盘;这个是nginx配置文件主要内容:
    location ./phpssdbadmin {
    try_files $uri $uri/ ./phpssdbadmin/index.php?$args;
    }
    location / {
    root html;
    index index.html index.htm ;
    }


    location ~ \.php$ {
    root F:/ssdb/phpssdbadmin;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } Reply
  • 今天第一次试用SSDB,碰到个问题,写入大概20W的KV数据,重启SSDB后,客户端就无法连接了,提示Error 10061,把配置文件中的压缩关闭后重启,就可以连接了 Reply
  • 请问有IOS方面的相关demo吗? OC或swift Reply
  • 请问,ssdb的list,能支持大数据吗? 比如有上亿条key-list, 每个list里面,有数千至数万条value, 这种情况下,ssdb会很吃内存吗? Reply
    @sunsh217: 不会很吃内存,内存占用多少取决于你配置的写的buffer和读的cache的大小。
    一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):cache_size + write_buffer_size * 66 + 32
    这是对于压缩选项没有开启的情况, 如果 compression: yes, 计算公式是:cache_size + 10 * write_buffer_size * 66 + 32
    你可以调整配置参数, 限制 ssdb-server 的内存占用.

    ref: http://ssdb.io/docs/zh_cn/config.html Reply
  • 关于网络协议那里,python3只能传字节类型的数据过去,如果数据有汉字,服务器会卡主。 Reply
    @hand: 请忽略这条。 Reply

« [2][3][4][5][6][7][8][9][10] » 6/18

Leave a Comment