2016-03-22 17 views
1

Reddede lua komutlarının kullanımını değerlendiriyorum ve biraz yavaş görünüyorlar. Ben izleyen bir kriter olarak: Bir olmayan lua sürümü içinNeden kızarmalarda bu kadar yavaş? Herhangi bir geçici çözüm var mı?

  1. , ben lua sürümü için basit SET key_i val_i 1M çarpı
  2. yaptım, aynı şeyi yaptım, ama bir komut: EVAL "SET KEYS[1] ARGV[1]" 1 key_i val_i

Dizüstü bilgisayarımın sınanması, lua sürümü, lua olmayan sürümden yaklaşık 3 kat daha yavaştır. Anladığım kadarıyla, bir betik dili değil, derlenmiş, vb. Ama bu çok fazla performans yükü gibi görünüyor - bu normal mi?

Bunun gerçekten normal olduğunu varsayarsak, herhangi bir geçici çözüm var mı? Daha iyi bir performans elde etmek için daha hızlı bir dilde C (hangi redis yazıldığı gibi) uygulayabilmenin bir yolu var mı?

Düzenleme: Burada yer alan go kodu kullanarak bu test ediyorum: https://gist.github.com/ortutay/6c4a02dee0325a608941

+0

Bunların ikisini de * nasıl * yaptın? Lua olmayan versiyonda bu döngüyü nasıl yürüttünüz? Ve Lua'da nasıl yürüdün? –

+0

Git kütüphanesi kullanıyorum ve sadece birkaç kez döngü yapıyorum. İşte test için tam komutum: https://gist.github.com/ortutay/6c4a02dee0325a608941 –

cevap

5

sorun Lua veya REDIS ile değil; beklentilerinizle. 1 milyon kez bir senaryo derliyorsunuz. Bunun hızlı olmasını beklemek için bir sebep yok.

Redis içindeki EVAL'ın amacı, tek bir komut yürütmemektir; Bunu kendin yapabilirsin. Amaç, yerel istemciden ziyade sunucuda, Redis'in kendisinde karmaşık mantık yapmaktır. Yani, EVAL başına bir set işlemi yapmak yerine, Redis sunucusunun kendisi tarafından yürütülecek tek bir EVAL komut dosyasında 1 milyon setin tamamını gerçekleştirirsiniz.

Go hakkında pek bir şey bilmiyorum, bu yüzden sözdizimini yazmak için yazamam. Ama Lua komut dosyası görüneceğini biliyoruz gibi: Bir Go dizede, daha sonra kaç kez hiçbir anahtar argümanlar ve olmayan tek bir tuş argüman ile, uygun çağrıya o geçmesini

for i = 1, ARGV[1] do 
    local key = "key:" .. tostring(i) 
    redis.call('SET', key, i) 
end 

Put döngü için.

+0

İlginç. Öyleyse sen de ek yükün çoğunun her zaman senaryoyu derlediğini söylüyorsun. İlk çalıştırmadan sonra önceden derlenmiş bir versiyonu veya bunun gibi bir şey beklemesini bekledim sanırım. –

+0

Redis, derlenmiş sürüm önbelleğe alındığı için yalnızca bir kez derleyiciyi derler, ancak büyük bir komut dosyasını çalıştırmak istiyorsanız bant genişliğini kaydetmek için EVALSHA kullanmak akıllıca olabilir. – maffews

İlgili konular