func makePublishRPUSH(conn redis.Conn, key outil.Selector) (publishFn, error) { if !key.IsConst() { // TODO: more clever bulk handling batching events with same key return publishEventsPipeline(conn, "RPUSH"), nil } var major, minor int var versionRaw [][]byte respRaw, err := conn.Do("INFO") resp, err := redis.Bytes(respRaw, err) if err != nil { return nil, err } versionRaw = versionRegex.FindSubmatch(resp) if versionRaw == nil { err = errors.New("unable to read redis_version") return nil, err } major, err = strconv.Atoi(string(versionRaw[1])) if err != nil { return nil, err } minor, err = strconv.Atoi(string(versionRaw[2])) if err != nil { return nil, err } // Check Redis version number choosing the method // how RPUSH shall be used. With version 2.4 RPUSH // can accept multiple values at once turning RPUSH // into batch like call instead of relying on pipelining. // // Versions 1.0 to 2.3 only accept one value being send with // RPUSH requiring pipelining. // // See: http://redis.io/commands/rpush multiValue := major > 2 || (major == 2 && minor >= 4) if multiValue { return publishEventsBulk(conn, key, "RPUSH"), nil } return publishEventsPipeline(conn, "RPUSH"), nil }