留言

在这里填写留言和我交流.

SSDB 相关的问题, 建议提在这里: http://www.ideawu.net/blog/ssdb, 就是本页顶部菜单的"SSDB"链接.

Views: 132774

581 Responses to "留言"

  • 环境:
    php 5.3.3 (cli) ,两棵 cpu xeon L5520, 24G内存, CentOS release 6.4 (Final)
    问题描述:前后安装了1.50.1.53,1.54,测试都发现一个问题:
    代码如下:
    require_once(‘SSDB.php’);
    $ssdb = new SimpleSSDB(‘127.0.0.1′, 8888);
    $ssdb->zset("name","0","80");
    echo ‘->>>’.$ssdb->zget("name","0");
    通过F5刷新网页,大多数显示->>>80 ,但是偶尔读不到这条数据,请问这是什么原因呀?是我操作问题吗?还是与我系统有关?谢谢 Reply
    @mindy: 你访问的服务器前面是否有代理或者LVS之类? 每一次访问时, webserver(如nginx/apache)是否有一条对应的access log? 你把zget的结果var_dump()出来看看, 因为echo false会输出空白. Reply
    直接访问apache的,没经过nginx,同时查看了log,也是一对一的,同时也测试在命令行php test.php 这种方式也会出现相同的错误,看来我是中奖了,哈。 Reply
    @mindy: 还有, SimpleSSDB() 第3个参数是超时时间, 单位是毫秒, 默认为 200 ms. 如果你们网站较差, 可以加大. Reply
    @mindy: 你用的SSDB.php文件是不是旧版本的? 旧版本有bug. 用最新的api/php/SSDB.php 替换试试. Reply
    使用1.54中的ssdb.php 也是同样的错误,跟踪代码到:$ret = @socket_write($this->sock, $s);
    加入
    echo socket_last_error();
    echo socket_strerror(socket_last_error());
    得到错误:
    代码为11 错误描述为:Resource temporarily unavailable
    直接在ssh 下用php test.php 这样的方式执行,不存在网络差的原因了。 Reply
    @mindy: 咱们在邮件里说吧. 邮箱地址: http://www.ideawu.net/gmail.png
    修改所有超时部分为2000,将socket_set_nonblock, socket_set_block, SO_RCVTIMEO, SO_SNDTIMEO相关的代码注释掉之后,不再出错,只是偶尔有的查询会返回很慢,是不是就是这些慢的查询导致超时?
    @mindy: Hi, 还不确定是否是超时导致的.

    1. 修改超时时间试试, 比如改改2000.
    2. 直接个性SSDB.php, 将socket_set_nonblock, socket_set_block, SO_RCVTIMEO, SO_SNDTIMEO相关的代码注释掉.

    麻烦尝试上面的修改, 确定下问题.
    用var_dump()时原空白显示为bool(false)…同样的数据库不变,我用java的api
    SSDB ssdb = null;
    Response resp;

    ssdb = new SSDB("127.0.0.1", 8888);
    ssdb.set("mm", "ee");

    byte[] b=ssdb.get("mm");
    String tmp=MemoryStream.repr(b);
    System.out.println(tmp);

    非常正常,不知道啥原因了,多线程java api也没问题…… Reply
    @mindy: 在笔记本上安装,这个问题无法重现,笔记本环境:
    php 5.3.3 (cli) ,i7 m620,CentOS release 6.4 (Final),6G内存,也就是除了cpu及内存之外没有区别,请问是因为双cpu的原因吗? Reply
  • ssdb,用java客户端测试,hset,hget,set,get操作value值大小1k左右,只能达到1200ops,请问下可以怎么优化吗?两次get操作,ops也是一样,感觉都是直接读写磁盘 Reply
    @lyb: 不好意思,这个是操作失误导致,没注意只用了单线程。用了多线程操作之后,set操作插入1亿条数据(value大小在1K),开15个线程(每个线程插大约7百万条),总体达到8800ops(ssdb.conf配置:cache_size:1G, block_size:8M, wirte_buffer_size:500M, compaction_sepped:100M。 机器配置:CPU:Inter(R) Xeon(R) CPU E5-2620, 32G内存,7200转硬盘),请问这个数据正常吗。ssdb-benchmark测试在3万多. Reply
    @lyb: 这个数据比较符合预期, 在正常范围. ssdb-benchmark的数据比较小, 所以能达到3万多. Reply
    @lyb: 你好, 请问你在相同环境使用自带的ssdb-benchmark测试, 能达到多少ops呢? Reply
    @ideawu: 还有问下,就是ssdb里面的hashmap个数,每个hashmap里面的key-value个数,都有建议的上限么? Reply
    @lyb: 这些上限只依赖硬盘的容量, 只要硬盘能存储, 就几乎没有上限. Reply
    @ideawu: ssdb.conf里面cacheSize开大了,读写速度反而下降了,这是什么原因?(开到了10G(比1G缓存低20%),电脑配置32G,) Reply
    @lyb: Hi, write_buffer_size不建议改变, 一般32即可. 设置大了会影响合并速度.

    如果写入的数据太多的话, ssdb在进行合并, 这个过程中读速度会下降. 应该等一段时间后再进行读benchmark.
    @lyb: 把cache_size设置为1M,反而跟1G一样,是否是这个缓存不起作用?
    @lyb: 同时,第二次读比第一次读还慢一点(按理应该数据都放在缓存里面,要快才对),是不是有其他设置。(ssdb.conf配置:cache_size:1G, block_size:1M, write_buffer_size:500M, compation_speed:100M)
  • ssdb 没有C接口的客户端API吗?
    或者说可以直接用hiredis? Reply
    @mailbox: Hi, 现在已经提供了最简洁的C/C++ API:


    #include "link.h"

    Link *link = Link::connect(ip, port);
    const std::vector<Bytes> *resp = link->request("get", "a");
    if(resp == NULL){
    // error
    }else{
    // ok
    }

    Reply
    @mailbox: hi, 你好. 有 C++ 客户端 API, 但还没有纯 C 的 API. 可以参考 ssdb-dump 的源码, 大致用法是


    Link *link = Link::connect(ip, port);
    link->send("get", "a");
    link->flush();
    link->read();
    const std::vector<Bytes> *req = link->recv();

    Reply
    @ideawu: 接口实现比较简单,不支持异步访问,对超时等情况需要程序自己处理。
    如果能提供功能比较全的C/C++接口会对项目应用推动较大,希望考虑 Reply
    @mailbox: 抓包看了一下,跟redis的协议不同。 不知是否开发C接口的API或者在hireadis中提供协议转码 Reply
  • 楼主,您好。我想问一个ssdb的问题。
    我们公司现在的产品环境中每天能产生1亿条数据,用leveldb来存储的话,数据量约为50G。由于数据量过大,所以我们考虑按时间来切分leveldb数据库,例如,一天建一个leveldb数据库。我想问一下,如果存在多个leveldb数据库,是不是也要相应起多个ssdb服务,如果是这样的话,批量查询又该怎么处理?或者说,ssdb能不能支持并且处理这种需求?
    期待您的答复。 Reply
    @youming: Hi, 一个ssdb实例所存储的数据, 应该在单机硬盘大小的范围内. 一般一台机器上一个应用只运行一个ssdb实例, 如果单个应用的数据超过单台机器的存储容量, 才考虑在多台机器上启动多个ssdb实例. 如果设计上确实需要分成多个leveldb数据库, 就要启动相对应数量的ssdb实例. 不知道你指的批量查询是什么样的查询? ssdb的查询只能针对一个实例. Reply
    @ideawu: 谢谢您的答复。我说的批量查询没说清楚,我们设计的时候可能会用时间来做key。由于我们估计数据量比较大,而leveldb没有表的概念,所以会用时间对leveldb进行切库。但是应用查询的时候,我们可能会指定一个时间段,而这个时间段极有可能跨多个库。所以我们的工作类似于要在ssdb上面再加一层,这样可以管理多个数据库实例。 Reply
    @youming: 明白. 这种情况确实要自己封装一层, 目前ssdb还不是分布式的, 在多个实例间查询只能自己处理. Reply
    @ideawu: 好的,多谢! Reply
  • 非常感谢您开发的抽奖小程序,实在是非常的使用,非常的棒!

    感谢您的共享精神和专业开发!

    祝:万事顺心,工作如意!

    Amaranth for Innocent Heart Compass! Reply
    很高兴抽奖小程序能对你有帮助! http://lottery.udpwork.com/ Reply
  • setTimeout("zz()",50);

    請問這個程式碼是不是沒辦法像輸入50的一樣快?
    那有什麼比SETTIMEOUT更快的程式碼?? Reply
  • 来踩踩,欢迎回访! Reply
  • 简历里单词拼错了sensior ->senior Reply
  • 你好,在网上漂泊多年。今天终于与到一知己,希望跟你学习,想跟贵站做个友情链接。
    8090博客站长敬上!! Reply
  • maven的原理和机制,以及servicemix的原理和两者怎么用?谢谢 Reply

« [7][8][9][10][11][12][13][14][15] » 11/28

Leave a Comment