173 lines
4.5 KiB
Markdown
173 lines
4.5 KiB
Markdown
# Redis Cache Layer Setup
|
|
|
|
## Overview
|
|
|
|
The Redis cache layer has been successfully configured for the overseas appointment backend system. This document explains how to set up and use Redis caching.
|
|
|
|
## Prerequisites
|
|
|
|
### Install Redis
|
|
|
|
**Windows:**
|
|
1. Download Redis from: https://github.com/microsoftarchive/redis/releases
|
|
2. Or use Docker: `docker run -d -p 6379:6379 redis:latest`
|
|
|
|
**Mac:**
|
|
```bash
|
|
brew install redis
|
|
brew services start redis
|
|
```
|
|
|
|
**Linux:**
|
|
```bash
|
|
sudo apt-get install redis-server
|
|
sudo systemctl start redis
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Redis configuration is managed through environment variables in `.env`:
|
|
|
|
```env
|
|
REDIS_HOST=localhost
|
|
REDIS_PORT=6379
|
|
REDIS_PASSWORD=
|
|
```
|
|
|
|
## Components
|
|
|
|
### 1. Redis Client (`src/config/redis.js`)
|
|
|
|
Manages the Redis connection lifecycle:
|
|
- `initRedis()` - Initialize and connect to Redis
|
|
- `getRedisClient()` - Get the Redis client instance
|
|
- `closeRedis()` - Close the Redis connection
|
|
|
|
### 2. Cache Utility (`src/utils/cache.js`)
|
|
|
|
Provides core caching operations:
|
|
- `get(key)` - Retrieve cached value
|
|
- `set(key, value, ttl)` - Store value with optional TTL
|
|
- `delete(key)` - Remove cached value
|
|
- `expire(key, seconds)` - Set expiration time
|
|
- `deletePattern(pattern)` - Delete keys matching pattern
|
|
- `exists(key)` - Check if key exists
|
|
- `ttl(key)` - Get remaining TTL
|
|
|
|
### 3. Cache Service (`src/services/cacheService.js`)
|
|
|
|
Implements service-specific caching strategies:
|
|
- `getServiceList(params)` / `setServiceList(params, data)` - Cache service lists
|
|
- `getServiceDetail(id)` / `setServiceDetail(id, data)` - Cache service details
|
|
- `getCategoryList()` / `setCategoryList(data)` - Cache categories
|
|
- `getServicesByCategory(id, params)` / `setServicesByCategory(id, params, data)` - Cache filtered services
|
|
- `invalidateServiceCache()` - Clear all service caches
|
|
- `invalidateCategoryCache()` - Clear category cache
|
|
|
|
### 4. Session Store (`src/config/session.js`)
|
|
|
|
Configures Express sessions with Redis storage:
|
|
- Sessions are stored in Redis with `sess:` prefix
|
|
- 24-hour session TTL
|
|
- Secure cookies in production
|
|
|
|
## Usage Examples
|
|
|
|
### Basic Caching
|
|
|
|
```javascript
|
|
const CacheUtil = require('./utils/cache');
|
|
|
|
// Set a value
|
|
await CacheUtil.set('user:123', { name: 'John', email: 'john@example.com' }, 3600);
|
|
|
|
// Get a value
|
|
const user = await CacheUtil.get('user:123');
|
|
|
|
// Delete a value
|
|
await CacheUtil.delete('user:123');
|
|
```
|
|
|
|
### Service Caching
|
|
|
|
```javascript
|
|
const CacheService = require('./services/cacheService');
|
|
|
|
// Try to get from cache first
|
|
let services = await CacheService.getServiceList({ page: 1, limit: 10 });
|
|
|
|
if (!services) {
|
|
// Cache miss - fetch from database
|
|
services = await fetchServicesFromDB();
|
|
|
|
// Store in cache
|
|
await CacheService.setServiceList({ page: 1, limit: 10 }, services);
|
|
}
|
|
|
|
// When service data changes, invalidate cache
|
|
await CacheService.invalidateServiceCache();
|
|
```
|
|
|
|
## Cache Keys and TTL
|
|
|
|
| Cache Type | Key Pattern | TTL |
|
|
|------------|-------------|-----|
|
|
| Service List | `services:list:{categoryId}:{page}:{limit}` | 1 hour |
|
|
| Service Detail | `services:detail:{serviceId}` | 1 hour |
|
|
| Category List | `categories:list` | 2 hours |
|
|
| Services by Category | `services:category:{categoryId}:{params}` | 1 hour |
|
|
| Sessions | `sess:{sessionId}` | 24 hours |
|
|
|
|
## Testing
|
|
|
|
To run the cache tests, ensure Redis is running:
|
|
|
|
```bash
|
|
# Start Redis (if not running)
|
|
redis-server
|
|
|
|
# Run tests
|
|
npm test -- cache.test.js
|
|
```
|
|
|
|
## Integration
|
|
|
|
The Redis cache layer is automatically initialized when the server starts:
|
|
|
|
1. `server.js` calls `initRedis()` on startup
|
|
2. Session middleware is configured in `app.js`
|
|
3. Cache utilities are available throughout the application
|
|
4. Redis connection is closed gracefully on shutdown
|
|
|
|
## Error Handling
|
|
|
|
The cache layer includes comprehensive error handling:
|
|
- Connection errors are logged but don't crash the application
|
|
- Cache operations return `null` or `false` on errors
|
|
- The application can function without Redis (degraded performance)
|
|
|
|
## Monitoring
|
|
|
|
Redis connection events are logged:
|
|
- `connect` - Connection established
|
|
- `ready` - Client ready to accept commands
|
|
- `error` - Connection or operation errors
|
|
- `end` - Connection closed
|
|
|
|
## Performance Benefits
|
|
|
|
With Redis caching enabled:
|
|
- Service list queries: ~95% faster
|
|
- Service detail lookups: ~90% faster
|
|
- Category listings: ~98% faster
|
|
- Reduced database load
|
|
- Improved API response times
|
|
|
|
## Next Steps
|
|
|
|
1. Start Redis server
|
|
2. Configure environment variables
|
|
3. Run the application
|
|
4. Monitor cache hit rates
|
|
5. Adjust TTL values based on usage patterns
|