← Files Upstash RedisARCHIVED FILE

skills/upstash-redis-js/performance/pipeline-optimization.md

2.38 KB · Oct 2, 2026 · 00:21 UTC

↓ Download file

# Pipeline Optimization

## Overview

Pipelines batch multiple Redis commands into one HTTP request. Use automatic pipelines for Promise.all patterns, manual pipelines for sequential operations.

## Good For

- Multiple independent operations
- High-latency networks
- Serverless functions with cold starts
- Operations that don't depend on each other's results

## Limitations

- Commands in pipeline cannot depend on previous results
- Large pipelines increase memory usage
- Errors in one command don't stop others

## Examples

### Auto-Pipeline Basics

```typescript
import { Redis } from "@upstash/redis";

// Auto-pipeline: enable globally
const redis = new Redis({
  url: process.env.UPSTASH_REDIS_REST_URL!,
  token: process.env.UPSTASH_REDIS_REST_TOKEN!,
  enableAutoPipelining: true,
});

// With auto-pipeline: Promise.all batches automatically
const [user, posts, comments] = await Promise.all([
  redis.get("user:1"),
  redis.lrange("posts:1", 0, 9),
  redis.lrange("comments:1", 0, 9),
]);
// Single HTTP request!
```

### Manual Pipeline

```typescript
import { Redis } from "@upstash/redis";

const redis = Redis.fromEnv();

// Manual pipeline: explicit control
const pipeline = redis.pipeline();
pipeline.get("user:1");
pipeline.lrange("posts:1", 0, 9);
pipeline.lrange("comments:1", 0, 9);

const results = await pipeline.exec();
```

### When to Use Pipelines

```typescript
import { Redis } from "@upstash/redis";

const redis = Redis.fromEnv();

// ❌ Bad: second operation depends on first
const bad = redis.pipeline();
bad.get("counter");
bad.incr("counter"); // Might not see previous get result
await bad.exec();

// ✅ Good: independent operations
const good = redis.pipeline();
good.get("user:1");
good.get("user:2");
good.get("user:3");
await good.exec();
```

### Pipeline Size Optimization

```typescript
import { Redis } from "@upstash/redis";

const redis = Redis.fromEnv();
const OPTIMAL_SIZE = 50;

async function pipelinedBatch(keys: string[]) {
  const results = [];
  for (let i = 0; i < keys.length; i += OPTIMAL_SIZE) {
    const batch = keys.slice(i, i + OPTIMAL_SIZE);
    const pipeline = redis.pipeline();
    batch.forEach((key) => pipeline.get(key));

    const batchResults = await pipeline.exec();
    results.push(...batchResults);
  }

  return results;
}

// Usage
const keys = Array.from({ length: 200 }, (_, i) => `key:${i}`);
const allResults = await pipelinedBatch(keys);
```

SHA-256: aa0def76a9d757248cd23ebca0631419dc09bd71c5395a4bd07526d11f4e83a9