最近一哥们面试一家在线视频直播的公司的PHP岗位,面试官问一题目“redis一定比memcached读写性能更好吗?”,哥们回答是不一定,但是这面试官一口咬定redis性能就是比memcached好,我对这个答案不置可否,我认为应该是看应用场景来判断性能优劣,而不能一口认定redis就比memcached的读写性能要好。
为了真实的反应最新版本的memcached和redis的单实例进程性能,我们做一个比较客观的测试。
测试环境:树莓派3,1G内存,4核 ARMv7
memcached:1.4.34版本,设置内存256M,参数设置为-r 100000 -c 10240 -m 256M -t 4 -b 20480
redis:3.2.7版本,关闭掉数据落地的相关设置,纯粹的测试内存的读写访问性能。
为了保证对redis和memcached的请求设置一致化,我们采用memtier_benchmark工具来进行性能压力测试。同时保证公平性采用memtier_benchmark默认的压力测试配置参数。
memcached压力测试命令:
./memtier_benchmark -p 11211 -P memcache_binary --hide-histogram
redis压力测试命令:
./memtier_benchmark -p 6379 --hide-histogram
测试结果如下:
redis:
root@home2:~/memtier_benchmark# ./memtier_benchmark -p 6379 --hide-histogram
[RUN #1] Preparing benchmark client...
[RUN #1] Launching threads now...
[RUN #1 100%, 76 secs] 0 threads: 2000000 ops, 26604 (avg: 26231) ops/sec, 1010.67KB/sec (avg: 996.38KB/sec), 7.52 (avg: 1.17) msec latencyy
4 Threads
50 Connections per thread
10000 Requests per thread
Type Ops/sec Hits/sec Misses/sec Latency KB/sec
------------------------------------------------------------------------
Sets 2367.43 --- --- 7.63500 182.35
Gets 23648.29 2.60 23645.69 7.61300 805.85
Waits 0.00 --- --- 0.00000 ---
Totals 26015.72 2.60 23645.69 7.61500 988.20
memcached:
root@home2:~/memtier_benchmark# ./memtier_benchmark -p 11211 -P memcache_binary --hide-histogram
[RUN #1] Preparing benchmark client...
[RUN #1] Launching threads now...
[RUN #1 100%, 54 secs] 0 threads: 2000000 ops, 44100 (avg: 36452) ops/sec, 1.79MB/sec (avg: 1.48MB/sec), 4.52 (avg: 1.18) msec latencyy
4 Threads
50 Connections per thread
10000 Requests per thread
Type Ops/sec Hits/sec Misses/sec Latency KB/sec
------------------------------------------------------------------------
Sets 3325.54 --- --- 5.50400 256.14
Gets 33218.86 3.65 33215.20 5.47500 1261.61
Waits 0.00 --- --- 0.00000 ---
Totals 36544.40 3.65 33215.20 5.47800 1517.75
从结果可以看出memcached的随机set get性能并不比redis差,因此我们抱有对memcached因为年久性能不行的固有思维印象是不可取的。memcached的多线程机制在读写交叉的高并发请求下性能或许会比redis要好一些,当然redis的主从机制是memcached未有的。