migrate-ioredis
Migrating from ioredis to Valkey GLIDE (Node.js)
Use when migrating a Node.js application from ioredis to the GLIDE client library.
Routing
- String, hash, list, set, sorted set, delete, exists, cluster -> API Mapping
- Pipeline, transaction, Batch API, multi -> Advanced Patterns
- PubSub, subscribe, publish, reversed args -> Advanced Patterns
- Lua scripting, defineCommand, evalsha -> Advanced Patterns
- Event handling, TypeScript -> Advanced Patterns
Key Differences
| Area | ioredis | GLIDE |
|---|---|---|
| Hash args | Spread pairs: hset("h", "k1", "v1", "k2", "v2") | Object: hset("h", {k1: "v1", k2: "v2"}) |
| Sorted set args | Interleaved: zadd("z", 1, "a", 2, "b") | Array of objects: zadd("z", [{element: "a", score: 1}]) |
| Expiry | Separate commands: setex, psetex | Options on set(): {expiry: {type, count}} |
| Multi-arg commands | Varargs or rest params | Array arguments |
| Connection model | Connection pool or single | Single multiplexed connection per node |
| Cluster | new Redis.Cluster([...]) | GlideClusterClient.createClient({...}) |
| Script caching | Manual defineCommand | Automatic via Script class |
| Events | EventEmitter (on("error")) | No event emitter - errors surface per-command |
Quick Start - Connection Setup
ioredis:
const Redis = require("ioredis");
const redis = new Redis({ host: "localhost", port: 6379 });
GLIDE:
import { GlideClient } from "@valkey/valkey-glide";
const client = await GlideClient.createClient({
addresses: [{ host: "localhost", port: 6379 }],
requestTimeout: 5000,
});
Configuration Mapping
| ioredis parameter | GLIDE equivalent |
|---|---|
| host, port | addresses: [{host, port}] |
| db | databaseId |
| password | credentials: {password} |
| username | credentials: {username, password} |
| connectTimeout | requestTimeout (covers full lifecycle) |
| tls: {} | useTls: true |
| retryStrategy | Built-in reconnection with connectionBackoff |
| maxRetriesPerRequest | Not applicable - GLIDE handles retries internally |
| lazyConnect: true | Default behavior in GLIDE |
Incremental Migration Strategy
No drop-in compatibility layer exists for Node.js. Migration approach:
- Install
@valkey/valkey-glidealongsideioredis - Create a wrapper module that abstracts the client interface
- Migrate route handlers or services one at a time behind the wrapper
- Use GLIDE's Batch API for bulk operations previously handled by ioredis pipelines
- Swap the wrapper implementation once all call sites are migrated
- Remove
ioredisdependency
Reference
| Topic | File |
|---|---|
| Command-by-command API mapping (strings, hashes, lists, sets, sorted sets, delete, exists, cluster) | api-mapping |
| Pipelines, transactions, Pub/Sub, Lua scripting, events, TypeScript | advanced-patterns |
See Also
- valkey-glide-nodejs skill - full GLIDE Node.js API details
- Scripting (see valkey-glide skill) - Lua scripting and the Script class
- PubSub (see valkey-glide skill) - subscription patterns and dynamic PubSub
- Batching (see valkey-glide skill) - pipeline and transaction patterns
Gotchas
- Hash argument format. ioredis accepts spread key-value pairs. GLIDE requires an object or HashDataType array.
- Sorted set format. ioredis uses interleaved score, member pairs. GLIDE uses {element, score} objects.
- No setex/psetex/setnx. Use set() with the expiry and conditionalSet options.
- Array args for multi-key commands. del, exists, lpush, sadd all take arrays, not rest parameters.
- Pipeline result format. ioredis returns [[error, result], ...]. GLIDE returns a flat result array.
- No event emitter. Handle errors per-command or set up external health checks.
- Node.js PubSub is creation-time only. Unlike Java/Python/Go, the Node.js client requires all subscriptions at connection time.
- Publish arg order reversed. ioredis: publish(channel, message). GLIDE: publish(message, channel).
- protobufjs bundle size. Adds ~19KB gzipped - relevant for serverless cold starts.
- npm version on Linux. Requires npm 11+ for proper optional dependency handling.
More from avifenesh/valkey-skills
valkey
Use when building apps with Valkey - caching, sessions, queues, locks, rate-limiting, leaderboards, counters, pub-sub, streams, scripting. Covers IFEQ/DELIFEQ, hash field TTL, COMMANDLOG. Not for server internals (valkey-dev) or ops (valkey-ops).
5valkey-dev
Use when contributing to the Valkey server - C internals, event loop, commands, data structures, cluster, replication, RDB/AOF, memory, threading, modules, Lua, RESP, tests. Not for app development (valkey) or ops (valkey-ops).
5valkey-ops
Use when deploying, configuring, monitoring, or troubleshooting self-hosted Valkey. Covers Sentinel, cluster, persistence, replication, security, Kubernetes, performance tuning. Not for app development (valkey) or server internals (valkey-dev).
5valkey-ecosystem
Use when evaluating the Valkey ecosystem - client libraries, modules (JSON, Bloom, Search), managed services (AWS, GCP, Aiven), monitoring tools, frameworks (Spring, Django, Rails), Docker/Kubernetes deployment, CI/CD patterns, migration from Redis, and developer tooling.
5glide-mq
Use when building message queues with glide-mq. Covers queue setup, producer/consumer patterns, job scheduling, workflows, batch processing, streaming, and suspend/resume. Not for migrating from BullMQ (migrate-bullmq) or Bee-Queue (migrate-bee).
4valkey-glide
Router for Valkey GLIDE per-language skills. Use when you need to find the right language-specific GLIDE skill or migration skill. Not for GLIDE library internals or contributing to GLIDE source code - use glide-dev instead.
4