Redis mongoDB'den ne kadar hızlı?


203

Redis'in "Hızlı Yanan" olduğu ve mongoDB'nin de hızlı olduğu yaygın olarak belirtilmiştir. Ama, ikisinin sonuçlarını karşılaştırarak gerçek sayıları bulmakta zorlanıyorum. Benzer konfigürasyonlar, özellikler ve işlemler göz önüne alındığında (ve faktörün farklı konfigürasyonlar ve işlemler ile nasıl değiştiğini gösteren), vb. Redis 10x daha hızlı mı, 2 kat daha hızlı mı, 5 kat daha hızlı mı?

SADECE performanstan bahsediyorum. MongoDB'nin farklı bir araç olduğunu ve daha zengin bir özellik kümesine sahip olduğunu anlıyorum. Bu "mongoDB'yi Redis'ten dahaiyi " tartışması değil. Soruyorum, Redis mongoDB'den hangi marjdan daha iyi?

Bu noktada, ucuz kriterler bile hiçbir kriterden daha iyidir.


2
Genel olarak, 5.000 ops / sn ve 10.000 ops / sn arasındaki farka dikkat etmek genellikle erken bir optimizasyon durumudur. Bununla birlikte, hala ilginç bir cevap :)
Kevin

Yanıtlar:


238

Aşağıdaki ölçütten kaba sonuçlar: 2x yazma, 3x okuma .

İşte python'da amaçlarınıza uyarlayabileceğiniz basit bir karşılaştırma ölçütü, her birinin değerleri ayarlayıp / almayı ne kadar iyi performans gösterdiğine bakıyordum:

#!/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 ve redis 2.2.5 ve en son pymongo / redis-py ile ilgili sonuçlar:

$ ./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

Sonuçları bir tuz tuzu ile alın! Başka bir dilde programlama yapıyorsanız, diğer istemcileri / farklı uygulamaları vb. Kullanıyorsanız sonuçlarınız çılgınca değişecektir. Kullanımınızdan bahsetmiyorum tamamen farklı olacak! En iyi bahsiniz onları tam olarak kullanmak istediğiniz şekilde kıyaslamaktır. Bir sonuç olarak, muhtemelen her birini kullanmanın en iyi yolunu bulursunuz . Her zaman kendiniz için kıyaslama yapın!


3
MongoDB ve Redis'in farklı kalıcılık yapılarına sahip olduğunu ve Redis'in yalnızca belleğe sığabilecek bir veri şemasını desteklediğini yorumlamakta fayda var. RAM ucuz olsa da, 12-16GB'den fazla veri kullanmanız / depolamanız gerekiyorsa, sunucu seçeneklerinizin nasıl göründüğünü görüyorum.
Tracker1

53
@sivann bu gönderi hiçbir ölçütten açıkça belirtilen "kaba" bir karşılaştırmaya gitmiyor. "Kıyaslama yanıltıcı" saçmalık ile bir trol olmayın. Elbette farklı koşullar sonuçları değiştirebilir. Katkıda bulunun ve vakanızı test eden kendi kriterlerinizi gönderin ve bunun yerine bu gönderiye bağlantı verin, o zaman hepimiz "test edilmiş" görüşünüzden faydalanacağız.
Homer6

2
@sivann Varsayılan (sevk edilen) yapılandırma, bu karşılaştırmanın test ettiği şeydir. IMHO, varsayılan yapılandırma, bir paketin fsync çitinin hangi tarafında bulunduğunu belirler. Redis için, veritabanı toplam sistem belleğinden daha büyük olduğunda insanları diğer alternatifleri kullanmaya teşvik eden bir bellek sunucusu olarak tanıtılır. MongoDB için veritabanı olarak ilan edilir. Postgres fsync'i asla kapatmaz çünkü açık bir şekilde ısrar kampındadırlar. Çoğu kişi yapılandırmaları değiştirmez, bu nedenle bu kıyaslama bu durumlar için biraz doğrudur.
Homer6

4
@Sivann ile aynı fikirdeyim, yayınladığınız kıyaslama ölümcül bir şekilde kusurlu. MongoDB çok iş parçacıklıdır ve Redis değildir. Karşılaştırma ölçütünüz çok iş parçacıklıysa, MongoDb'nin çok çekirdekli bir makinede daha yüksek bir verime sahip olduğunu görürsünüz.
ColinM

2
@ Homer6 bellek odaklı DB için bile, WriteConcern etkinken test etmelisiniz (varsayılan olarak devre dışıdır). Olmadan test etmek, her türlü kıyaslama için gerçekten saçmadır. Reddis için benzer. Tüm işlemleri disk üzerinde senkronize etmeyen DB'ler, verileri en az 2 sunucuya çoğaltarak güvenliği sağlar. Bu, yazılarınızın disk senkronizasyonu için beklemediği, ancak geri dönmeden önce ağ çoğaltması için beklediği anlamına gelir. Hataları beklememek eşyada hiç yapılmayan bir şeydir. ağa yazarken ağ kablosunun bağlı olup olmadığını algılamamak gibi.
sivann

18

Lütfen Redis ve MongoDB ekleme performansı analizi hakkında bu gönderiyi kontrol edin :

5000 girişe kadar mongodb $ push, Redis RPUSH ile karşılaştırıldığında bile daha hızlıdır, o zaman inanılmaz derecede yavaş olur, muhtemelen mongodb dizi tipi doğrusal ekleme süresine sahiptir ve bu nedenle yavaşlar ve yavaşlar. mongodb, sabit bir zaman ekleme listesi türünü ortaya çıkararak biraz performans kazanabilir, ancak doğrusal zaman dizisi türüyle bile (sabit zaman aramasını garanti edebilir) küçük veri setleri için uygulamalarına sahiptir.


15

İyi ve basit kıyaslama

Redis (2.6.16) ve mongo'nun (2.4.8) mevcut sürümlerini kullanarak sonuçları tekrar hesaplamaya çalıştım ve sonuç şu

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

Ayrıca bu blog yazısı , node.js kullanarak her ikisini de karşılaştırır. Veritabanındaki giriş sayısının zamanla birlikte artmasının etkisini gösterir.


8

İkisi aynı alanda olmadığı için sayıları bulmak zor olacak. Genel cevap, veri seti tek bir makinenin çalışma belleğine sığdığında Redis'in% 10 - 30 daha hızlı olmasıdır. Bu miktarda veri aşıldığında Redis başarısız olur. Moğol yük türüne bağlı olarak yavaşlayacaktır. Sadece bir tip yük için, bir kullanıcı yakın zamanda 6 ila 7 büyüklükte bir yavaşlama bildirmiştir (10.000 ila 100.000 kez), ancak bu rapor ayrıca yapılandırma sorunları olduğunu ve bunun çok atipik bir çalışma yükü olduğunu kabul etti. Verilerin bir kısmının diskten okunması gerektiğinde, normal okuma ağır yükleri yaklaşık 10 kat anekdotla yavaştır.

Sonuç: Redis daha hızlı olacak, ancak bir çok şey olmayacak.


7

İşte yaklaşık 1 yaşında Tornado çerçevesinde oturum performansı hakkında mükemmel bir makale . Redis ve MongoDB'nin dahil olduğu birkaç farklı uygulama arasında bir karşılaştırma vardır. Makaledeki grafik, Redis'in bu özel kullanım durumunda MongoDB'nin arkasında yaklaşık% 10 olduğunu belirtti.

Redis, üzerinde çalıştığınız makinenin performansını analiz edecek yerleşik bir kıyaslama ölçütü ile birlikte gelir. Redis için Benchmark wiki'sinde bir ton ham veri var . Ama biraz Moğol'a bakmanız gerekebilir. Gibi burada , burada ve bazı rasgele cila numaraları (ama size bazı MongoDB Kendini kriterler çalıştırmak için bir başlangıç noktası verir).

Bu soruna en iyi çözümün testleri beklediğiniz durumlarda kendiniz yapmak olduğuna inanıyorum.


Tornado kriterleri, Redis ve MongoDb'yi Zend_Cache arka ucu olarak kullanma konusundaki kendi testlerimle iyi uyum sağlıyor. MongoDb'nin daha zengin işlevselliği, daha az istek kullanmanıza olanak tanır ve çok iş parçacıklı tasarım, çok iş parçacıklı olmayan tek bir Redis işleminden çok daha iyi ölçeklendirilir. Sonuç olarak MongoDb daha yüksek ölçeklenir. Ayrıca, Redis artık sanal belleği desteklemiyor.
ColinM

3

Benim durumumda, performans karşılaştırmasında belirleyici olan faktör kullanılan MongoDb WriteConcern. Günümüzde çoğu mongo sürücüsü varsayılan WriteConcern'i ACKNOWLEDGED olarak ayarlayacaktır, bu da 'RAM'e yazılmıştır' ( Mongo2.6.3-WriteConcern ), bu bağlamda, çoğu yazma işlemi için yeniden yazmak çok benzerdi.

Ancak gerçek, uygulama gereksinimlerinize ve üretim ortamı kurulumunuza bağlıdır, bu endişeyi WriteConcern.JOURNALED (oplog'a yazılır) veya WriteConcern.FSYNCED (diske yazılır) veya hatta çoğaltma kümelerine (yedeklemeler) yazabilirsiniz. Eğer gerekliyse.

Ardından, bazı performans düşüşleri görmeye başlayabilirsiniz. Diğer önemli faktörler arasında veri erişim modellerinizin nasıl optimize edildiği, endeks özledim yüzdesi (bkz. Mongostat ) ve genel olarak endeksler sayılabilir .


0

Gösterilen kıyaslamadaki 2-3X'in yanıltıcı olduğunu düşünüyorum, çünkü eğer çalıştırdığınız donanıma da bağlıysanız - deneyimlerime göre, makine 'daha güçlü', daha büyük boşluk (Redis lehine) muhtemelen karşılaştırmalı değerlendirmenin bellek sınırlarına ulaşması oldukça hızlı olacaktır.

Bellek kapasitesine gelince - bu kısmen doğrudur, ayrıca etrafta dolaşmanın yolları da olduğundan, Redis verilerini diske geri yazan (ticari) ürünler ve ayrıca bellek boyutunun üstesinden gelen küme (çok parçalı) çözümler vardır sınırlama.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.