2013-07-10 7 views
2

Mongodb findAndmodify와 redis increment 명령의 속도면에서 얼마나 좋은지 궁금합니다. 나는 Mongodb findAndModify가 문서에서 r/w 잠금을 수행 할 것임을 알고 있지만, redis가 더 선호 할 수있는 옵션인지 궁금해하고 있다면 100 개의 스레드가 동시에 쓰려고합니다.Mongodb findAndModify 대 redis incr

+1

나는 redis를 사용하지 않았지만 ... 대신 MongoDBs $ inc 명령을 대신 사용 하시겠습니까? – Sammaye

+1

그것을 테스트해라. (그리고 어딘가에 블로그에 대해 :)). StackOverflow를 고려하기에는 너무 많은 측면이 있습니다. 하드웨어, 개발자, 관리, 유지 보수, 요구 사항/요구. – WiredPrairie

+0

응답을 주셔서 감사합니다 ... 누군가 이미 그것을했는지 궁금 해서요 ... 나는 그것을 시도 줄 것이다 :) –

답변

2

이러한 비교 결과를 변경할 수있는 많은 매개 변수가 있습니다.

Mongodb는 문서가 아닌 데이터베이스 수준에서 r/w 잠금을 수행합니다. Redis는 단일 스레드 서버이며 모든 것을 직렬화합니다. 동시성의 입상 성의 관점에서 볼 때 이것은 거의 동일합니다. Redis 구현은 Mongodb을 사용하면 동일한 잠금 장치에서 경쟁하는 수백 개의 스레드로 끝나기 때문에보다 효율적입니다.

프로토콜 수준에서 어떤 일이 발생하는지 고려해야합니다. Mongodb 프로토콜은 비대칭이므로 마지막 작업이 성공했는지 (즉 필수 승인이 없는지) 확인하지 않고도 데이터를 전송할 수 있습니다. Redis 프로토콜은 순수한 클라이언트/서버이므로 각 명령은 클라이언트 응용 프로그램에서 읽어야 할 결과를 반환합니다. 명령을 파이프 라인 처리 할 수 ​​있습니다. 프로토콜 수준에서 Mongodb은 Redis보다 신속하게 데이터를 전송할 수 있습니다 (명령 승인없이 순수한 성능을 고려함).

또한 지속성 옵션에 따라 달라집니다. Mongodb 저널링은 선택 사항이므로 Redis 추가 전용 파일 구성입니다. 각 상점의 구성 방식에 따라 크게 다른 결과가 나옵니다. MongoDB 또는 Redis 클러스터의 마스터/슬레이브 복제는 결과를 변경합니다 ...

MongoDB 또는 Redis를 컴파일하는 데 사용한 컴파일러, 커널 버전 등과 같은 다른 환경 요인에 따라 달라질 수 있습니다.

그래서 자신의 환경에서 자체 벤치 마크를 실행해야합니다.

실행 속도가 빠르고 지저분한 벤치 마크는 쉽지만 (그다지 대표적인 것은 아니므로 그 결과는 소금 한 알을 사용해야합니다). MongoDB를 가진

의 몽고 쉘에서 : 레디 스와

> db.toto.save({_id:1, val:0 }) 
> ops = [ { op: "update", ns:db.toto, query:{_id:1}, update:{ $inc : { val:1 } } } ] ; 
> res = benchRun({ parallel: number_of_connections, seconds: 20, ops:ops, host:"localhost:7380" }); 

:

여기
$ redis-benchmark -q -n 100000 -t incr -c number_of_connections -P pipelining_factor 

난 그냥 내 상자에 수집 한 몇 가지 수치입니다

MongoDB 1 connection     64613 updates/s 
MongoDB 50 connections     53825 updates/s 
Redis  1 connection no pipelining 29437 updates/s 
Redis 50 connections no pipelining 101626 updates/s 
Redis 50 connections pipelining=50 442477 updates/s 

우리가 할 수는 MongoDB가 비대칭 프로토콜로 인해 하나의 연결로 매우 효율적이라는 것을 알 수 있습니다. 그러나이 효율성은 r/w 잠금으로 인한 연결 수. Redis는 파이프 라인과 연결없이 클라이언트/서버 프로토콜에 의해 속도가 크게 느려집니다. 그러나 작업 부하가 더 많은 연결에 분산되거나 파이프 라이닝이 사용되면 승인 대기 비용이 상각되고 Redis는 MongoDB보다 많은 처리량을 얻을 수 있습니다 (특히 $ 0.02 벤치 마크에서).