秦悦明的运维笔记

redis与ssdb对比压测

1. ssdb简介

“一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.”官网上面是这么说的。
个人理解是一个兼容redis数据结构,底层用leveldb的nosql数据库。

2. ssdb安装

1
2
3
4
5
6
7
yum install -y autoconf gcc-c++
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make
# optional, install ssdb in /usr/local/ssdb
make install

先得把gcc-c++安装好。如果有问题,目录删了重新编译。。如果说在编译鲁棒性上面redis说完虐ssdb,应该没人会反对吧。

3. 配置

基本都是默认配置,redis测了开aof的和不开aof,当然开aof qps会下降一些,后面有详细数据。
ssdb也是默认配置,开了binlog。
注意一下redis对内核设置有要求:

1
2
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

两个版本分别为 4.0.6 和1.9.6。
机器是在8核16G的机器上面测的。

4. 压测注意事项

很有意思的是2个程序都自带了压测工具,redis的叫redis-benchmark,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-k <boolean>]
-h <hostname> Server hostname (default 127.0.0.1)
-p <port> Server port (default 6379)
-s <socket> Server socket (overrides host and port)
-a <password> Password for Redis Auth
-c <clients> Number of parallel connections (default 50)
-n <requests> Total number of requests (default 100000)
-d <size> Data size of SET/GET value in bytes (default 3)
--dbnum <db> SELECT the specified db number (default 0)
-k <boolean> 1=keep alive 0=reconnect (default 1)
-r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD
Using this option the benchmark will expand the string __rand_int__
inside an argument with a 12 digits number in the specified range
from 0 to keyspacelen-1. The substitution changes every time a command
is executed. Default tests use this to hit random keys in the
specified range.
-P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline).
-e If server replies with errors, show them on stdout.
(no more than 1 error per second is displayed)
-q Quiet. Just show query/sec values
--csv Output in CSV format
-l Loop. Run the tests forever
-t <tests> Only run the comma separated list of tests. The test
names are the same as the ones produced as output.
-I Idle mode. Just open N idle connections and wait.

1
2
3
4
5
6
7
8
9
10
11
ssdb-bench - SSDB benchmark tool, 1.9.6
Copyright (c) 2013-2015 ssdb.io
Usage:
tools/ssdb-bench [ip] [port] [requests] [clients]
Options:
ip server ip (default 127.0.0.1)
port server port (default 8888)
requests Total number of requests (default 10000)
clients Number of parallel connections (default 50)

注意,client都是开50个线程,request却差了10倍。redis默认是10w,ssdb默认是1w,所以ssdb测时候指定了10w个连接。

1
2
redis-bench
tools/ssdb-bench 127.0.0.1 8888 100000 50

5. 结论

ssdb的结果:

redis:

PING_INLINE PING_BULK SET GET INCR LPUSH RPUSH LPOP RPOP SADD HSET SPOP LPUSH LRANGE_100 LRANGE_300 LRANGE_500 LRANGE_600 MSET
152207.00 137741.05 120192.30 141843.97 168634.06 179211.45 140056.03 150150.14 136798.91 144717.80 132978.73 142653.36 173010.38 49236.83 20898.64 15415.45 11823.13 116414.43
146627.56 158478.61 162866.44 149031.30 147275.41 149031.30 169491.53 175438.59 163398.70 166112.95 142045.45 159489.64 152905.20 63856.96 23218.02 14925.37 10511.93 74515.65

第二行是开了aof的数据,set反而高了。

ssdb:

set get del hset hget hdel zset zget zdel qpush qpop
82281 43160 65208 41184 43745 48159 38246 42734 36934 42031 30591

redis不论set,get都是15w左右的qps,ssdb差不多是3,4w左右,差距还是有一些的,redis基本上是全面碾压ssdb。
当然我个人觉得如果是实际业务的话,也应该在技术选型的时候压测一把,特定业务场景的压测非常重要。另外redis比ssdb优势的一点是其社区更加壮大,可运维性大于ssdb,当然这是题外话了。