2013-11-17

性能超越 Redis 的 NoSQL 数据库 SSDB

Views: 51770 | 34 Comments

SSDB 是一个 C++ 开发的 NoSQL 数据库, 使用 Google 公司开源的 LevelDB 引擎作为底层的存储引擎. Redis 是一个 C 语言开发的内存 NoSQL 数据库.

Redis 非常流行, 不仅仅是因为其高性能和可持久化的特点, 还因为它支持丰富的数据结构, 能很好的表达业务模型. Redis 的国内属新浪应用比较广泛.

但是, Redis 的缺点也很明显, 那就是它的内存数据库模型. 所有数据都存在内存中, 即使最有钱的互联网公司, 也没法承受 $5000 (一台服务器, 100G 内存)固定成本, 以及持续不断的 IDC 租金成本来存储区区的 50GB 的数据, 这个成本太高了!

SSDB 拥有 Redis 的主要优点 - 高性能, 丰富数据结构, 并且拥有 Redis 所不具备的能力 - 大数据存储能力. SSDB 服务器的单机存储能力是 Redis 的 100 倍! 因为 SSDB 能将数据存储在硬盘中.

在使用 SSDB 自带的 ssdb-bench 工具, 以及 Redis 自带的 redis-benchmark 工具在相同机器上的测试中, SSDB 的读性能完全超过了 Redis, 这非常出乎意料. 不过, SSDB 的写性能还是比 Redis 慢了 10% 左右. 要知道, SSDB 是一个硬盘数据库, 而 Redis 是内存数据库, 后者写性能高一些是可以理解的.

欢迎各位在自己的机器上做性能测试, 并反馈. 下面我做的测试的结果图.

机器信息: MacBook Pro, Retina, 13-inch, Late 2012


SSDB 性能

Related posts:

  1. SSDB 支持 Redis 协议!
  2. 从 Redis 迁移到 SSDB
  3. SSDB NoSQL 数据库引擎介绍
  4. Redis 的作者狂喷某 NoSQL 数据库
  5. SSDB 1.6.8.7 发布, 支持 Android 运行
Posted by ideawu at 2013-11-17 22:44:56 Tags:

34 Responses to "性能超越 Redis 的 NoSQL 数据库 SSDB"

  • redis-benchmark有个参数是指定数据大小,ssdb-bench没有哦..redis-benchmark的数据大小要设成多少,测试才公平呢? Reply
  • 你好,正在考虑在我们得游戏项目中使用ssdb,有几个疑问:
    1. 看到有两个ssdb和redis性能对比柱状图,一个图中二者性能几乎相当,另外一个,并发数较高得情况下,ssdb性能差不多是redis得一半左右。请问为什么会是这样?
    2. 不考虑网络层开销,如果ssdb得性能能达到和redis可比的程度是不是主要归功于leveldb的效率?
    3. ssdb对支持hash zset的高效率访问是主要归功于leveldb(leveldb对于hash和zset的原生支持效率就比较高?)?还是主要归功于ssdb的额外处理?ssdb中的hash和zset在leveldb中是否有原生的数据结构与之对应?
    4. mongodb也是(磁盘+内存)db,有没有mongodb和ssdb的一些性能对比?
    5. 国人好像实现了redis基于leveldb的存储(redis使用leveldb来实现持久化)。ssdb有没有与它的一些比较?
    6. 如果提供了充分的物理内存,通过配置,ssdb是不是也可以把全部数据库都加载到内存?ssdb和redis性能对比时,是不是ssdb(leveldb)把全部数据集加载到内存的情况?
    7. 用了ssdb是不是就没有必要再考虑冷热数据处理的情况?即热数据会根据访问模式被自动缓存在内存中?

    非常感谢并期待你的答复!谢谢! Reply
    @竿子: Hi,
    1. 那个较早的图是用python版的ssdb-bench来测得的, python本身的性能有问题, 后来改成c语言版本.
    2. 是的.
    3. leveldb只支持纯粹的KV, 丰富的数据结构是ssdb提供的.
    4. 没有.
    5. 没有.
    6. 可以.
    7. 对, 只有数据不超过硬盘容量, 不需要特别考虑冷热数据的问题. Reply
    @ideawu:
    谢谢你的答复,我再追加几个问题:
    1.据你分析,如果用你提供的java-client 是否能够得到与c-client相当的性能?你提供的java-client与另外一个ssdb4.jar有无明显性能和使用上的差异?
    2.游戏应用中主要是对单个玩家数据的set 和 get。那么只需要用玩家id作为key直接使用set()get()接口就可以了吧(方案1),没必要把所有玩家数据都存储在一个key里面,来使用hset(key,value)hget(key, value)吧(方案2)?如果采用方案2,性能会不会差很多?因为如果采用方案2,可以方便的把角色的不同数据分表进行处理。比如所有玩家的基本属性存储在一个hashtab中,所有玩家的包裹信息存储在另外一个hashtab中。

    谢谢! Reply
    @竿子: Hi,
    1. 这个没对比过, 你可以对比看看.
    2. 这个设计主要看你经常操作的数据占整个数据的比重. 比如你的玩家信息有100个字段, 但你一般只操作其中一个字段, 那么如果全放到一个字符串中, 每次操作时encode/decode就会非常影响性能. Reply
  • 测试数据很简陋哦,没有场景(key、value的大小等),也没有配置(比如ssdb几个线程)
    是否在拿多线程的ssdb和单工作线程的redis在比较呢? Reply
    @allenlz: redis 的数据是通过其自带的 redis-benchmark 工具测得的. Reply
    @ideawu: 我的意思是服务端是否多线程了? Reply
  • 您好,正在考虑如何使用SSDB。
    首先感谢你和你的SSDB,O(∩_∩)O~
    这里请教一点东西,看你的benchmark结果,我想测试数据都是在内存当中的吧?
    如果是10亿级别数据,热数据有50%,那么绝大部分的读请求如果需要进行一次硬盘读取的话,这样的读性能如何有什么经验么?
    谢谢! Reply
    @Hijacker_cxz: 如果热数据有50%, 那么性能下降: 50% x (1 – 硬盘速度/内存速度) Reply
  • 网址填写错误,重发:
    本也想用redis,但全内存存储也不合适,数据量太大,读多写少,准备基于thrift和boost实现一个。初步想法,分索引和数据文件,数据文件追加写,欢迎探讨交流。 Reply
  • 本也想用redis,但全内存存储也不合适,数据量太大,读多写少,准备基于thrift和boost实现一个。初步想法,分索引和数据文件,数据文件追加写,欢迎探讨交流。 Reply
    @一见:
    预计读写效率都比较理想,实现会浪费点磁盘存储,比如100万时才重整回收垃圾。 Reply
  • Hi, 请问一下什么api时候a能支持分布式存储呢?(类似于sharding).

    另外请问一下,SSDB的硬盘存储跟redis的有什么不同? Reply
    @s0what: Hi, 分布式暂时还没有支持. 你可以找一个 leveldb 和 redis 相关的资料, 了解一下两者的硬盘存储结构. 例如这些文章: http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html Reply
  • 首先谢谢你开源了这么好用的东西.
    请教以下几个问题:
    1. ssdb支持百亿级别的key-value吗, 因为我的key就可能是百亿级别的.
    2. ssdb的一个zset最多支持多少个元素, 在达到多少级别时,会出现性能的下降.可以支持到10亿级别吗, 我看你之前的blog中有提到,单个的zset的元素支持亿级别
    3. java的api接口有考虑使用nio的方式提供吗 Reply
    @wen66: Hi,

    1. 目前我们的应用已经达到百亿级别.
    2. zset 的容量上限是64位整数个, 可以理解为没有限制. 随着 zset 变大, 速度不会有影响.
    3. Java 的接口改进还没有来得及, 欢迎有兴趣的朋友参与改进. Reply
    @ideawu: 谢谢你的及时回复.
    追问一下, 你们的应用达到百亿级别,那是把所有的kv都放在一个ssdb实例里,还是如你之前blog里提到的,因数据是静态的,所以可以分布到多个ssdb实例里,自己在应用程序做选择. Reply
    @wen66: Hi, 我们是单个实例百亿条数据, 使用双主架构, 仅使用其中一个作为写, 故障时整体切换到另一个写. Reply
    @ideawu: 双主架构,能不能介绍下。ssdb不是只支持主从吗? Reply
    @wen66: ssdb 的双主配置比较简单, 只需要将 replication.type 设为 mirror, 然后各指向对方即可.
  • int zlist(const Bytes &name_s, const Bytes &name_e, uint64_t limit,
    std::vector<std::string> *list) const;


    SSDB支持 key –> list模型吗? 貌似zlist不是这种场景 Reply
    @icy: Hi, ssdb 还没有支持 redis 中的 list. 不过, 你可以用 hash(map) 来替代. Reply
  • 有没有相关的文档说明,存储模型是什么样的? Reply
    重点想要了解一下:list的实现思路。 Reply

« [1][2] » 1/2

Leave a Comment