Memcache session storage for remix/session. Use this package when app servers need to share session state through Memcache.
Installation
Memcache storage uses TCP sockets and requires a Node.js runtime.
API Reference
createMemcacheSessionStorage
Create a Memcache-backed session storage instance.
Memcache server address in the format host:port (e.g., '127.0.0.1:11211')
options
MemcacheSessionStorageOptions
Configuration options
MemcacheSessionStorageOptions
Prefix for all Memcache keys. Defaults to 'remix:session:'.
Time-to-live in seconds for sessions. Defaults to 0 (no expiration).
Whether to reuse unknown session IDs sent by the client. Defaults to false.
Returns
A SessionStorage instance backed by Memcache
Usage Examples
Basic Setup
Connect to Memcache and create session storage:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
let sessionStorage = createMemcacheSessionStorage('127.0.0.1:11211', {
keyPrefix: 'myapp:session:',
ttlSeconds: 60 * 60 * 24 * 7, // 7 days
})
With Session Middleware
Use with session middleware for automatic session management:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
import { session } from 'remix/session-middleware'
import { createRouter } from 'remix/fetch-router'
import { createCookie } from 'remix/cookie'
let sessionStorage = createMemcacheSessionStorage('127.0.0.1:11211', {
keyPrefix: 'myapp:session:',
ttlSeconds: 60 * 60 * 24 * 7,
})
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 { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
import { createSession } from 'remix/session'
let sessionStorage = createMemcacheSessionStorage('127.0.0.1:11211')
// Create a new session
let session = createSession()
session.set('userId', '123')
session.set('username', 'alice')
// Commit to Memcache
await sessionStorage.commitSession(session)
// Read from Memcache
let loadedSession = await sessionStorage.readSession(session.id)
console.log(loadedSession.get('userId')) // '123'
// Destroy session
await sessionStorage.destroySession(session)
Production Configuration
Use environment variables for production:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
let sessionStorage = createMemcacheSessionStorage(
process.env.MEMCACHE_SERVER || '127.0.0.1:11211',
{
keyPrefix: 'prod:session:',
ttlSeconds: 60 * 60 * 24 * 30, // 30 days
}
)
Multiple Memcache Servers
For multiple servers, you’ll need to handle connection pooling at a higher level. The storage connects to one server at a time:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
// Connect to primary server
let primaryStorage = createMemcacheSessionStorage('memcache1.example.com:11211', {
keyPrefix: 'session:',
})
// Fallback to secondary if primary fails
let secondaryStorage = createMemcacheSessionStorage('memcache2.example.com:11211', {
keyPrefix: 'session:',
})
Session Expiration
Set appropriate TTL to prevent unlimited session growth:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
let sessionStorage = createMemcacheSessionStorage('127.0.0.1:11211', {
// Short TTL for sensitive sessions
ttlSeconds: 60 * 15, // 15 minutes
})
Key Prefixes for Isolation
Use key prefixes to isolate sessions from different applications:
import { createMemcacheSessionStorage } from 'remix/session-storage-memcache'
// App 1
let app1Storage = createMemcacheSessionStorage('127.0.0.1:11211', {
keyPrefix: 'app1:session:',
})
// App 2
let app2Storage = createMemcacheSessionStorage('127.0.0.1:11211', {
keyPrefix: 'app2:session:',
})
Environment Variables
Store Memcache configuration in environment variables:
MEMCACHE_SERVER=127.0.0.1:11211
SESSION_SECRET=your-secret-key
Best Practices
- Always set a TTL to prevent unlimited session growth
- Use meaningful key prefixes to organize sessions
- Handle connection errors gracefully
- Set appropriate maxAge on session cookies to match TTL
- Monitor Memcache memory usage and evictions
- Use multiple Memcache servers for redundancy
- Consider Memcache memory limits when sizing sessions
- Memcache is very fast for session storage
- Network latency is the primary bottleneck
- Memcache uses LRU eviction when memory is full
- Monitor cache hit rates to ensure adequate memory
- Consider using connection pooling for high-traffic apps
Limitations
- Requires Node.js (uses TCP sockets)
- Sessions may be evicted if Memcache runs out of memory
- No persistence - sessions are lost if Memcache restarts
- Single server connection per storage instance
Session
Core session API and management
Session Middleware
Automatic session management middleware