From d7b83274b7119b63c7e21fd1ef0adcfde68d18fe Mon Sep 17 00:00:00 2001 From: Andrey Kuzmin Date: Fri, 12 Apr 2019 12:52:10 +0300 Subject: [PATCH] Add comments about pipeline technique. Notes about it's usage in case of big pipelines and low read/write timeouts. --- cluster.go | 13 +++++++++++++ pipeline.go | 13 +++++++++++++ redis.go | 26 ++++++++++++++++++++++++++ ring.go | 13 +++++++++++++ 4 files changed, 65 insertions(+) diff --git a/cluster.go b/cluster.go index c9f1384..34c5774 100644 --- a/cluster.go +++ b/cluster.go @@ -1182,6 +1182,19 @@ func (c *ClusterClient) reaper(idleCheckFrequency time.Duration) { } } +// Pipeline returns mechanism to realise Redis Pipeline technique. +// +// Pipelining is a technique to extremely speed up processing by packing +// operations to batches, send them at once to Redis and read a replies in a +// singe step. +// See https://redis.io/topics/pipelining +// +// Pay attention, that Pipeline is not a transaction, so you can get unexpected +// results in case of big pipelines and small read/write timeouts. +// Redis client has retransmission logic in case of timeouts, pipeline +// can be retransmitted and commands can be executed more then once. +// To avoid this: it is good idea to use reasonable bigger read/write timeouts +// depends of your batch size and/or use TxPipeline. func (c *ClusterClient) Pipeline() Pipeliner { pipe := Pipeline{ exec: c.processPipeline, diff --git a/pipeline.go b/pipeline.go index b3a8844..1afa2e5 100644 --- a/pipeline.go +++ b/pipeline.go @@ -107,6 +107,19 @@ func (c *Pipeline) Pipelined(fn func(Pipeliner) error) ([]Cmder, error) { return c.pipelined(fn) } +// Pipeline returns mechanism to realise Redis Pipeline technique. +// +// Pipelining is a technique to extremely speed up processing by packing +// operations to batches, send them at once to Redis and read a replies in a +// singe step. +// See https://redis.io/topics/pipelining +// +// Pay attention, that Pipeline is not a transaction, so you can get unexpected +// results in case of big pipelines and small read/write timeouts. +// Redis client has retransmission logic in case of timeouts, pipeline +// can be retransmitted and commands can be executed more then once. +// To avoid this: it is good idea to use reasonable bigger read/write timeouts +// depends of your batch size and/or use TxPipeline. func (c *Pipeline) Pipeline() Pipeliner { return c } diff --git a/redis.go b/redis.go index 644c8da..842f4de 100644 --- a/redis.go +++ b/redis.go @@ -456,6 +456,19 @@ func (c *Client) Pipelined(fn func(Pipeliner) error) ([]Cmder, error) { return c.Pipeline().Pipelined(fn) } +// Pipeline returns mechanism to realise Redis Pipeline technique. +// +// Pipelining is a technique to extremely speed up processing by packing +// operations to batches, send them at once to Redis and read a replies in a +// singe step. +// See https://redis.io/topics/pipelining +// +// Pay attention, that Pipeline is not a transaction, so you can get unexpected +// results in case of big pipelines and small read/write timeouts. +// Redis client has retransmission logic in case of timeouts, pipeline +// can be retransmitted and commands can be executed more then once. +// To avoid this: it is good idea to use reasonable bigger read/write timeouts +// depends of your batch size and/or use TxPipeline. func (c *Client) Pipeline() Pipeliner { pipe := Pipeline{ exec: c.processPipeline, @@ -558,6 +571,19 @@ func (c *Conn) Pipelined(fn func(Pipeliner) error) ([]Cmder, error) { return c.Pipeline().Pipelined(fn) } +// Pipeline returns mechanism to realise Redis Pipeline technique. +// +// Pipelining is a technique to extremely speed up processing by packing +// operations to batches, send them at once to Redis and read a replies in a +// singe step. +// See https://redis.io/topics/pipelining +// +// Pay attention, that Pipeline is not a transaction, so you can get unexpected +// results in case of big pipelines and small read/write timeouts. +// Redis client has retransmission logic in case of timeouts, pipeline +// can be retransmitted and commands can be executed more then once. +// To avoid this: it is good idea to use reasonable bigger read/write timeouts +// depends of your batch size and/or use TxPipeline. func (c *Conn) Pipeline() Pipeliner { pipe := Pipeline{ exec: c.processPipeline, diff --git a/ring.go b/ring.go index aa47543..eb6b4b3 100644 --- a/ring.go +++ b/ring.go @@ -558,6 +558,19 @@ func (c *Ring) defaultProcess(cmd Cmder) error { return cmd.Err() } +// Pipeline returns mechanism to realise Redis Pipeline technique. +// +// Pipelining is a technique to extremely speed up processing by packing +// operations to batches, send them at once to Redis and read a replies in a +// singe step. +// See https://redis.io/topics/pipelining +// +// Pay attention, that Pipeline is not a transaction, so you can get unexpected +// results in case of big pipelines and small read/write timeouts. +// Redis client has retransmission logic in case of timeouts, pipeline +// can be retransmitted and commands can be executed more then once. +// To avoid this: it is good idea to use reasonable bigger read/write timeouts +// depends of your batch size and/or use TxPipeline. func (c *Ring) Pipeline() Pipeliner { pipe := Pipeline{ exec: c.processPipeline,