mongoDB보다 Redis가 얼마나 빠릅니까?


204

Redis는 "Blazing Fast"이고 mongoDB도 빠르다고 널리 언급되어 있습니다. 그러나 두 결과를 비교하는 실제 숫자를 찾는 데 문제가 있습니다. 비슷한 구성, 기능 및 운영 (및 다른 구성 및 운영에 따라 요인이 어떻게 변하는지를 보여주는 등) 등이 주어지면 Redis는 10 배 빨라 졌습니까? 2 배 빨라 졌습니까? 5 배 빨라 졌습니까?

나는 성능에 대해서만 이야기하고 있습니다. mongoDB는 다른 도구이며 더 풍부한 기능 세트가 있음을 이해합니다. 이것은 " Redis보다 mongoDB가 더 낫다 "라는 논쟁 이 아니다 . Redis가 mongoDB를 능가하는 한계는 무엇입니까?

이 시점에서 저렴한 벤치 마크조차 벤치 마크가없는 것보다 낫습니다.


10
저렴한 벤치 마크는 항상 벤치 마크가없는 것보다 낫습니다. 질문을 해주셔서 감사합니다.
Maziyar

2
일반적으로 5,000 ops / sec와 10,000 ops / sec의 차이를 걱정하는 것은 종종 조기 최적화의 경우입니다. 그것은 여전히 ​​흥미로운 답변입니다 :)
Kevin

답변:


238

다음 벤치 마크의 대략적인 결과 : 2x 쓰기, 3x 읽기 .

다음은 파이썬에서 목표에 맞게 조정할 수있는 간단한 벤치 마크입니다. 각 값이 단순히 설정 / 검색 값이 얼마나 잘 수행되는지보고있었습니다.

#!/usr/bin/env python2.7
import sys, time
from pymongo import Connection
import redis

# connect to redis & mongodb
redis = redis.Redis()
mongo = Connection().test
collection = mongo['test']
collection.ensure_index('key', unique=True)

def mongo_set(data):
    for k, v in data.iteritems():
        collection.insert({'key': k, 'value': v})

def mongo_get(data):
    for k in data.iterkeys():
        val = collection.find_one({'key': k}, fields=('value',)).get('value')

def redis_set(data):
    for k, v in data.iteritems():
        redis.set(k, v)

def redis_get(data):
    for k in data.iterkeys():
        val = redis.get(k)

def do_tests(num, tests):
    # setup dict with key/values to retrieve
    data = {'key' + str(i): 'val' + str(i)*100 for i in range(num)}
    # run tests
    for test in tests:
        start = time.time()
        test(data)
        elapsed = time.time() - start
        print "Completed %s: %d ops in %.2f seconds : %.1f ops/sec" % (test.__name__, num, elapsed, num / elapsed)

if __name__ == '__main__':
    num = 1000 if len(sys.argv) == 1 else int(sys.argv[1])
    tests = [mongo_set, mongo_get, redis_set, redis_get] # order of tests is significant here!
    do_tests(num, tests)

mongodb 1.8.1 및 redis 2.2.5 및 최신 pymongo / redis-py의 결과 :

$ ./cache_benchmark.py 10000
Completed mongo_set: 10000 ops in 1.40 seconds : 7167.6 ops/sec
Completed mongo_get: 10000 ops in 2.38 seconds : 4206.2 ops/sec
Completed redis_set: 10000 ops in 0.78 seconds : 12752.6 ops/sec
Completed redis_get: 10000 ops in 0.89 seconds : 11277.0 ops/sec

물론 소금 한 알갱이로 결과를 얻으십시오! 다른 언어로 프로그래밍하거나 다른 클라이언트 / 다른 구현 등을 사용하는 경우 결과가 크게 달라질 수 있습니다. 말할 것도없이 사용법은 완전히 다릅니다! 최선의 방법은 정확하게 사용하려는 방식으로 직접 벤치마킹하는 것입니다. 결과적으로 당신은 아마도 각각을 사용 하는 가장 좋은 방법을 알아낼 것입니다 . 항상 자신을 위해 벤치마킹하십시오!


3
MongoDB와 Redis는 서로 다른 지속성 구조를 가지고 있으며 Redis는 메모리에 적합한 데이터 스키마 만 지원한다고 언급 할 가치가 있습니다. 램은 저렴하지만 12-16GB 이상의 데이터를 사용 / 저장해야 할 경우 서버 옵션이 어떻게 보이는지 알 수 있습니다.
추적기 1

53
@sivann이 포스트는 벤치 마크가없는 것에서 명확하게 명시된 "거친"벤치 마크로 이동합니다. "벤치 마크가 오해의 소지가있다"는 말도 안되는 트롤이되지 마십시오. 물론 조건에 따라 결과가 달라질 수 있습니다. 사례를 테스트하고 대신이 게시물에서 연결하는 자체 벤치 마크를 다시 제출하고 제출하면 "테스트 된"의견의 혜택이 모두 제공됩니다.
호머 6

2
@sivann 기본 (발송 된) 구성은이 벤치 마크에서 테스트 한 것입니다. IMHO, 기본 구성은 패키지가있는 fsync 펜스의 어느 쪽을 결정합니다. Redis의 경우 데이터베이스가 전체 시스템 메모리보다 클 때 사람들이 다른 대안을 사용하도록 촉구하는 메모리 서버로 알려졌습니다. MongoDB의 경우 데이터베이스로 광고됩니다. Postgres는 퍼시스턴스 캠프에 있기 때문에 fsync를 절대로 끄지 않았습니다. 대부분의 사람들은 구성을 수정하지 않으므로 이러한 경우에이 벤치 마크는 다소 정확합니다.
Homer6

4
@sivann에 동의합니다 . 게시 한 벤치 마크에 치명적인 결함이 있습니다. MongoDB는 멀티 스레드이며 Redis는 아닙니다. 벤치 마크가 다중 스레드 인 경우 MongoDb가 실제로 다중 코어 시스템에서 더 높은 처리량을 가짐을 알 수 있습니다.
ColinM

2
메모리 지향 DB의 경우에도 @ Homer6은 WriteConcern이 활성화 된 상태에서 테스트해야합니다 (기본적으로 비활성화되어 있음). 없는 벤치마킹은 모든 종류의 벤치 마크에서 의미가 없습니다. reddis와 유사합니다. 모든 트랜잭션을 디스크에서 동기화하지 않는 DB는 2 개 이상의 서버로 데이터를 복제하여 안전을 유지합니다. 즉, 쓰기는 디스크 동기화를 기다리지 않고 네트워크 복제를 반환하기 전에 기다립니다. 오류를 기다리지 않는 것은 자극에 결코 이루어지지 않은 일입니다. 네트워크에 쓸 때 네트워크 케이블이 연결되어 있는지 감지하지 않는 것과 같습니다.
Sivann

18

Redis 및 MongoDB 삽입 성능 분석에 대한 이 게시물을 확인하십시오 .

최대 5000 개 항목 mongodb $ push는 Redis RPUSH와 비교할 때도 빠르며, 매우 느려졌습니다. 아마도 mongodb 배열 유형에 선형 삽입 시간이있어서 느리고 느려집니다. mongodb는 일정한 시간 삽입 목록 유형을 노출하여 약간의 성능을 얻을 수 있지만 선형 시간 배열 유형 (일정한 시간 조회를 보장 할 수 있음)을 사용하더라도 작은 데이터 세트에 대한 응용 프로그램이 있습니다.


15

좋고 간단한 벤치 마크

redis (2.6.16) 및 mongo (2.4.8)의 현재 버전을 사용하여 결과를 다시 계산하려고 시도했으며 결과는 다음과 같습니다.

Completed mongo_set: 100000 ops in 5.23 seconds : 19134.6 ops/sec
Completed mongo_get: 100000 ops in 36.98 seconds : 2703.9 ops/sec
Completed redis_set: 100000 ops in 6.50 seconds : 15389.4 ops/sec
Completed redis_get: 100000 ops in 5.59 seconds : 17896.3 ops/sec

또한이 블로그 게시물 은 둘 다를 비교하지만 node.js를 사용합니다. 시간이 지남에 따라 데이터베이스에서 항목 수가 증가하는 효과를 보여줍니다.


8

둘이 같은 공간에 있지 않기 때문에 숫자를 찾기가 어려울 것입니다. 일반적인 대답은 데이터 세트가 단일 시스템의 작업 메모리에 적합 할 때 Redis가 10-30 % 더 빠르다는 것입니다. 해당 데이터 양을 초과하면 Redis가 실패합니다. 몽고는 부하 유형에 따라 속도가 느려집니다. 인서트 전용 부하 유형의 경우, 한 사용자가 최근 6 ~ 7 배 (10,000 ~ 10,000 배)의 속도 저하를보고했지만이 보고서는 구성 문제가 있으며 이는 매우 비정형적인 작업 부하라는 사실을 인정했습니다. 디스크에서 일부 데이터를 읽어야 할 경우 일반 읽기로드가 약 10 배 정도 느려집니다.

결론 : Redis는 더 빠를 것이지만 많은 것이 아닙니다.


7

세션 성능 에 대한 훌륭한 기사입니다.토네이도 프레임 워크의 에 약 1 살입니다. Redis와 MongoDB가 포함 된 몇 가지 다른 구현을 비교합니다. 이 기사의 그래프에 따르면이 특정 사용 사례에서 Redis가 MongoDB보다 약 10 % 더 낫습니다.

Redis에는 사용중인 머신의 성능을 분석하는 벤치 마크가 내장되어 있습니다. Redis 의 Benchmark Wiki 에는 수많은 원시 데이터가 있습니다 . 그러나 몽고를 조금 둘러 봐야 할 수도 있습니다. 여기 , 여기 및 임의의 광택 숫자 와 같이 (그러나 그것은 당신에게 몇 가지 MongoDB를 자신을 벤치 마크 실행하기위한 시작점을 제공합니다).

이 문제에 대한 최선의 해결책은 원하는 상황에서 직접 테스트를 수행하는 것입니다.


Tornado 벤치 마크는 Redis 및 MongoDb를 Zend_Cache 백엔드로 사용하는 자체 테스트와 잘 일치합니다. MongoDb의 풍부한 기능을 사용하면 다중 스레드가 아닌 단일 Redis 프로세스보다 훨씬 적은 수의 요청을 사용하고 다중 스레드 설계를 확장 할 수 있습니다. 결론적으로 MongoDb는 더 높아집니다. 또한 Redis는 더 이상 가상 메모리를 지원하지 않습니다.
ColinM

3

필자의 경우 성능 비교에서 결정적인 요인은 사용되는 MongoDb WriteConcern입니다. 오늘날 대부분의 몽고 드라이버는 기본 WriteConcern을 ACKNOWLEDGED로 설정하여 'RAM에 기록됨'을 의미합니다 ( Mongo2.6.3-WriteConcern )을 의미하며, 대부분의 쓰기 작업에서 redis와 매우 유사합니다.

그러나 실제로는 응용 프로그램 요구 사항과 프로덕션 환경 설정에 따라이 문제를 WriteConcern.JOURNALED (oplog에 기록) 또는 WriteConcern.FSYNCED (디스크에 기록) 또는 복제 세트 (백업)에 기록 할 수 있습니다. 필요한 경우.

그런 다음 성능이 약간 저하 될 수 있습니다. 다른 중요한 요소에는 데이터 액세스 패턴 최적화 방법, 인덱스 미스 % ( mongostat 참조 ) 및 일반적인 인덱스도 포함됩니다.


0

표시된 벤치 마크에서 2-3X는 오해의 소지가 있다고 생각합니다. 사용자가 하드웨어를 사용하는 경우에도 경험이 많기 때문에 내 경험에 따르면 기계가 강할수록 간격이 더 큽니다 (Redis에 유리함). 아마도 벤치 마크가 메모리 한계에 도달한다는 사실에 의해 아마도 매우 빠릅니다.

메모리 용량에 관해서는-이것은 부분적으로 사실입니다.이를 해결할 수있는 방법이 있기 때문에 Redis 데이터를 디스크에 다시 쓰는 (상업용) 제품과 메모리 크기를 극복하는 클러스터 (멀티 샤드) 솔루션이 있습니다 한정.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.