Skip to main content
Redis-backed session storage for remix/session. Use this package when app servers need to share session state through Redis.

Installation

npm install remix redis

API Reference

createRedisSessionStorage

Create a Redis-backed session storage instance.
client
RedisClient
required
Connected Redis client instance from the redis package
options
RedisSessionStorageOptions
Configuration options

RedisSessionStorageOptions

keyPrefix
string
Prefix for all Redis keys. Defaults to 'session:'.
ttl
number
Time-to-live in seconds for sessions. If not set, sessions don’t expire.
useUnknownIds
boolean
Whether to reuse unknown session IDs sent by the client. Defaults to false.

Returns

storage
SessionStorage
A SessionStorage instance backed by Redis

Usage Examples

Basic Setup

Connect to Redis and create session storage:
import { createClient } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'

// Create and connect Redis client
let redis = createClient({ url: process.env.REDIS_URL })
await redis.connect()

// Create session storage
let sessionStorage = createRedisSessionStorage(redis, {
  keyPrefix: 'session:',
  ttl: 60 * 60 * 24, // 24 hours
})

With Session Middleware

Use with session middleware for automatic session management:
import { createClient } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'
import { session } from 'remix/session-middleware'
import { createRouter } from 'remix/fetch-router'
import { createCookie } from 'remix/cookie'

let redis = createClient({ url: process.env.REDIS_URL })
await redis.connect()

let sessionStorage = createRedisSessionStorage(redis, {
  keyPrefix: 'myapp:session:',
  ttl: 60 * 60 * 24 * 7, // 7 days
})

let sessionCookie = createCookie('session', {
  secrets: [process.env.SESSION_SECRET!],
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production',
  sameSite: 'lax',
  maxAge: 60 * 60 * 24 * 7,
})

let router = createRouter({
  middleware: [
    session({
      storage: sessionStorage,
      cookie: sessionCookie,
    }),
  ],
})

Manual Session Management

Manage sessions manually:
import { createClient } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'
import { createSession } from 'remix/session'

let redis = createClient({ url: process.env.REDIS_URL })
await redis.connect()

let sessionStorage = createRedisSessionStorage(redis)

// Create a new session
let session = createSession()
session.set('userId', '123')
session.set('username', 'alice')

// Commit to Redis
await sessionStorage.commitSession(session)

// Read from Redis
let loadedSession = await sessionStorage.readSession(session.id)
console.log(loadedSession.get('userId')) // '123'

// Destroy session
await sessionStorage.destroySession(session)

Custom TTL Per Session

While the storage has a default TTL, you can also set expiration in Redis directly:
import { createClient } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'

let redis = createClient({ url: process.env.REDIS_URL })
await redis.connect()

let sessionStorage = createRedisSessionStorage(redis, {
  keyPrefix: 'session:',
  // No default TTL
})

// For important sessions, set longer TTL via Redis
await redis.expire(`session:${sessionId}`, 60 * 60 * 24 * 30) // 30 days

Multiple Applications Sharing Redis

Use key prefixes to isolate sessions from different applications:
import { createClient } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'

let redis = createClient({ url: process.env.REDIS_URL })
await redis.connect()

// App 1
let app1Storage = createRedisSessionStorage(redis, {
  keyPrefix: 'app1:session:',
})

// App 2
let app2Storage = createRedisSessionStorage(redis, {
  keyPrefix: 'app2:session:',
})

Redis Cluster

Works with Redis Cluster:
import { createCluster } from 'redis'
import { createRedisSessionStorage } from 'remix/session-storage-redis'

let cluster = createCluster({
  rootNodes: [
    { url: 'redis://node1:6379' },
    { url: 'redis://node2:6379' },
    { url: 'redis://node3:6379' },
  ],
})
await cluster.connect()

let sessionStorage = createRedisSessionStorage(cluster, {
  keyPrefix: 'session:',
  ttl: 60 * 60 * 24,
})

Environment Variables

Store Redis configuration in environment variables:
.env
REDIS_URL=redis://localhost:6379
SESSION_SECRET=your-secret-key

Best Practices

  • Always set a TTL to prevent unlimited session growth
  • Use meaningful key prefixes to organize sessions
  • Connect to Redis before creating session storage
  • Handle Redis connection errors gracefully
  • Use Redis Cluster for high availability
  • Set appropriate maxAge on session cookies to match TTL
  • Monitor Redis memory usage

Performance Considerations

  • Redis operations are fast but add network latency
  • Use connection pooling for high-traffic applications
  • Consider using Redis pipelining for batch operations
  • Monitor Redis memory and eviction policies

Session

Core session API and management

Session Middleware

Automatic session management middleware

Build docs developers (and LLMs) love