Redis müşterileri boru hatlarını nasıl uygular?

Redis protokol dokümanlarında şunları belirtir:

Bir istemci, birden çok yayınlamak için aynı bağlantıyı kullanabilir   emreder. Pipelining desteklenir, böylece çoklu komutlar gönderilebilir   İstemci tarafından tek bir yazma işlemi ile, okumak için gerekli değildir   Sunucu, bir sonraki komutu vermek için cevap verir. Tüm cevaplar   sonunda okunabilir.

Bununla birlikte, bunun gerçekte nasıl uygulandığına dair bir örnek bulamıyorum. Redis müşterisi boru hatlarını nasıl uygular?

5

3 cevap

Bunun nasıl gerçekleştirildiğine dair birkaç iyi, basit örnek ruby redis istemcisinin kaynağında bulunabilir, Aşağıda listelenen redis-rb ve Python'un redis-py biri.

Onlar esasen TaylorOtwell'in yukarıda bahsettiği şeyleri, bir boru hattında tek bir ağ isteğiyle redis için yapılacak istekleri müşteri tarafında birleştirirken, işlemler redis komutlarını kullanacaktır. MULTI / EXEC bir işlemi başlatmak ve bitirmek için.

redis-rb (from redis.rb and pipeline.rb):

def pipelined(options = {})
  synchronize do
    begin
      original, @client = @client, Pipeline.new
      yield
      if @client.commands.empty?
        []
      else
        original.call_pipelined(@client.commands, options)
      end
    ensure
      @client = original
    end
  end
end

def call_pipelined(commands, options = {})
  @commands.concat commands
  nil
end

Başka bir iyi örnek, redis-py , bir Python redis istemcisi. Umarım yardımcı olur.

5
katma

kolayca bir TCP akışı mesajlar sınırlamak olabilir sürece, küçük destek gerçekten borulama desteklemek için bir sunucu için gerekli olan,/ayrıştırma sizin için veri tampon olacak ve bir sunucu olarak sadece okuyabilir, TCP yığını tek yan istekleri Bir, ve istekleri bitirdiğinizde cevapları geri gönderin. İstemcinin/sunucunun, bu arabelleklerin dolduğu zaman, kilitlenmeyeceği durumları bilmesi ve ele alması gerekir.

Yani, redis için networking.c'deki processInputBuffer ()/processMultibulkBuffer() 'a bir bakın, redis de kendi çıktı tamponlamasını içerir, örn. cevap ekle()

4
katma

Sadece yukarıdaki cevaplara biraz daha içgörü atmak. Redis boru hattını anlamanın bir yolu, redis boru hattının tamamen müşterinin bir uygulaması olduğu ve redis sunucusunun bununla hiçbir ilgisinin olmadığı gerçeğini anlamaktır. Bu, farklı istemci uygulaması arasında farklılık gösterirken, genel fikir şu:

Pipelining, yüksek ağ gecikme ortamlarında yanıt gecikme sorunlarını çözmeyi amaçlamaktadır. Yani, komutları göndermek ve yanıt okumak için ağ üzerinde harcanan zaman miktarı ne kadar az olursa o kadar iyidir. Bu, tamponlama ile etkili bir şekilde gerçekleştirilir. İstemci, sunucuya gönderilmeden önce TCP yığındaki komutları (diğer yanıtlarda da belirtildiği gibi) arabelleğe alabilir (veya içermeyebilir). Sunucuya gönderildikten sonra, sunucu bunları yürütür ve sunucu tarafında bunları arabelleğe alır. Müdahalenin alındığı anda müşterinin cevabı okuduğu olağan durumdan farklı olarak, boru hattı durumunda, istemci, sunucu tarafı arabelleğini oluşturan yanıtları bölümler halinde veya uygulama “senkronizasyon” gerçekleştirdiğinde okuyor (boru hattını kapatın). Bu avantajlıdır, çünkü istemciler tarafından ağ üzerinden harcanan zaman, cevapları okumada çok daha azdır.

Here's a post on my blog which you may refer to get a better idea: http://nachivpn.blogspot.in/2014/11/redis-pipeline-explained.html

2
katma