# How-To: Implement Redis Session Storage in Your QQQ Application
This guide walks through integrating the QBit Session Store with Redis into an existing QQQ application.
## Prerequisites
- QQQ application (0.40.0+)
- Redis server (6.2+ recommended for optimal performance)
- Maven-based project
## Step 1: Add the Dependency
Add to your `pom.xml`:
```xml
com.kingsrook.qbits
qbit-session-store
0.1.0
```
The Jedis Redis client is included transitively.
## Step 2: Configure the QBit
In your `QInstance` setup (typically in your application's MetaData producer or initialization code):
```java
import com.kingsrook.qbits.sessionstore.QSessionStoreProviderType;
import com.kingsrook.qbits.sessionstore.QSessionStoreQBitConfig;
import com.kingsrook.qbits.sessionstore.QSessionStoreQBitProducer;
import java.time.Duration;
// In your QInstance initialization
new QSessionStoreQBitProducer()
.withConfig(new QSessionStoreQBitConfig()
.withProviderType(QSessionStoreProviderType.REDIS)
.withRedisHost("localhost")
.withRedisPort(6379)
.withDefaultTtl(Duration.ofHours(8))
.withEnableSlidingExpiration(true))
.produce(qInstance, "sessionStore");
```
## Step 3: Configure Redis Connection (Production)
For production deployments with authentication:
```java
new QSessionStoreQBitConfig()
.withProviderType(QSessionStoreProviderType.REDIS)
.withRedisHost(System.getenv("REDIS_HOST"))
.withRedisPort(Integer.parseInt(System.getenv("REDIS_PORT")))
.withRedisPassword(System.getenv("REDIS_PASSWORD"))
.withRedisKeyPrefix("myapp:session:")
.withDefaultTtl(Duration.ofHours(8))
.withEnableSlidingExpiration(true)
```
## Configuration Reference
| Option | Default | Description |
|--------|---------|-------------|
| `redisHost` | (required) | Redis server hostname |
| `redisPort` | 6379 | Redis server port |
| `redisPassword` | null | Redis AUTH password |
| `redisKeyPrefix` | `qqq:session:` | Key namespace prefix |
| `defaultTtl` | 1 hour | Session expiration time |
| `enableSlidingExpiration` | true | Reset TTL on each access |
| `enableCleanupProcess` | true | Register cleanup process (no-op for Redis) |
## How It Works
Once configured, QQQ's authentication system automatically uses the session store:
1. **Login**: Session is serialized to JSON and stored in Redis with TTL
2. **Request**: Session is loaded from Redis; TTL is reset if sliding expiration is enabled
3. **Logout**: Session is removed from Redis
Redis keys follow the pattern: `{prefix}{sessionUuid}` (e.g., `qqq:session:abc-123-def`)
## Verifying the Integration
Check Redis directly:
```bash
redis-cli
> KEYS qqq:session:*
> TTL qqq:session:
> GET qqq:session:
```
## AWS ElastiCache Example
```java
new QSessionStoreQBitConfig()
.withProviderType(QSessionStoreProviderType.REDIS)
.withRedisHost("my-cluster.cache.amazonaws.com")
.withRedisPort(6379)
.withRedisKeyPrefix("prod:session:")
.withDefaultTtl(Duration.ofHours(24))
```
## Troubleshooting
**Connection refused**: Verify Redis is running and accessible from your application host.
**Sessions not persisting**: Check that the QBit producer is called before authentication is initialized.
**Key not found after restart**: Redis persistence may be disabled. Configure RDB or AOF persistence in Redis.
## Next Steps
- Configure Redis Cluster for high availability
- Set up Redis Sentinel for automatic failover
- Monitor session metrics via Redis INFO command