Redis-backed session storage for remix/session. Use this package when app servers need to share session state through Redis.
Installation
API Reference
createRedisSessionStorage
Create a Redis-backed session storage instance.
Connected Redis client instance from the redis package
options
RedisSessionStorageOptions
Configuration options
RedisSessionStorageOptions
Prefix for all Redis keys. Defaults to 'session:'.
Time-to-live in seconds for sessions. If not set, sessions don’t expire.
Whether to reuse unknown session IDs sent by the client. Defaults to false.
Returns
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:
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
- 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