---
document_type: "reference_doc"
service: "REDIS"
title: "Momentry Core Redis Key 設計規範"
date: "2026-03-17"
version: "V1.0"
status: "active"
owner: "Warren"
created_by: "OpenCode"
tags:
  - "momentry"
  - "core"
  - "redis"
  - "設計規範"
ai_query_hints:
  - "查詢 Momentry Core Redis Key 設計規範 的內容"
  - "Momentry Core Redis Key 設計規範 的主要目的是什麼？"
  - "如何操作或實施 Momentry Core Redis Key 設計規範？"
---

# Momentry Core Redis Key 設計規範

| 項目 | 內容 |
|------|------|
| 建立者 | Warren |
| 建立時間 | 2026-03-17 |
| 文件版本 | V1.0 |

---

## 版本歷史

| 版本 | 日期 | 目的 | 操作人 | 工具/模型 |
|------|------|------|--------|-----------|
| V1.0 | 2026-03-17 | 創建文件 | Warren | OpenCode / MiniMax M2.5 |
| V1.1 | 2026-03-25 | 新增可配置 Redis Key Prefix | Warren | OpenCode / GLM-5 |

---

## 1. 概述

本文檔說明 momentry_core 如何使用 Redis 作為監控和狀態管理系統。

## 2. 可配置 Redis Key Prefix

### 2.1 環境變數

從 V1.1 開始，所有 Redis Keys 都支援自定義前綴：

```bash
MOMENTRY_REDIS_PREFIX=momentry:
```

此設定允許多個 momentry 實例共用同一個 Redis 伺服器，例如：
- **生產環境**: `MOMENTRY_REDIS_PREFIX=momentry:`
- **開發環境**: `MOMENTRY_REDIS_PREFIX=momentry_dev:`

### 2.2 Key 格式

所有 Key 都遵循以下格式：

```
{prefix}{key_type}:{uuid}
```

範例 (生產環境):
```
momentry:job:5dea6618a606e7c7
momentry:jobs:active
momentry:health:current
```

範例 (開發環境):
```
momentry_dev:job:5dea6618a606e7c7
momentry_dev:jobs:active
momentry_dev:health:current
```

### 2.3 預設值

| Binary | 預設 Port | 預設 Redis Prefix |
|--------|-----------|-------------------|
| `momentry` (生產) | 3002 | `momentry:` |
| `momentry_playground` (開發) | 3003 | `momentry_dev:` |

## 3. UUID 使用時機

### 3.1 全局 Keys（無 UUID）

- 單一實例全局狀態
- 聚合統計數據

### 3.2 Per-Video Keys（UUID 必要）

- 每個視頻獨立處理狀態
- 即時進度追蹤

### 3.3 Per-Processor Keys（UUID + Processor 必要）

- 每個 processor 獨立狀態

## 4. Key 命名空間

```
momentry
├── health:                    # 健康檢查
│   ├── current              # 當前狀態 (TTL: 60s)
│   └── services            # 依賴服務狀態
├── config:                    # 配置
├── stats:                     # 聚合統計
│   ├── total_jobs          # 總 Jobs 數
│   ├── processed_today     # 今日處理數
│   ├── cpu:current         # 當前 CPU 使用
│   └── memory:current      # 當前 Memory 使用
├── jobs:                      # Jobs 管理
│   ├── active              # Set: 運行中 UUIDs
│   ├── completed            # Set: 完成 UUIDs
│   └── failed              # Set: 失敗 UUIDs
├── job:{uuid}              # Per-Video Job 狀態 (TTL: 24h)
│   ├── status              # 狀態 String
│   ├── video_path          # 視頻路徑
│   ├── current_processor   # 當前 processor
│   ├── progress_total      # 總進度
│   ├── progress_current    # 當前進度
│   ├── started_at          # 開始時間
│   ├── updated_at          # 最後更新
│   └── processor:{name}    # Per-Processor 狀態
│       ├── status
│       ├── progress
│       ├── current
│       ├── total
│       └── started_at
├── progress:{uuid}         # Pub/Sub 頻道 (即時進度)
├── result:{uuid}           # 處理結果 Hash
├── output:{uuid}           # 輸出路徑
├── metrics:{uuid}         # Per-Video 指標
│   ├── cpu                # CPU 歷史 List (100條, TTL: 1h)
│   ├── memory             # Memory 歷史 List (100條, TTL: 1h)
│   └── duration           # 處理時長
└── log:{uuid}             # 處理日誌 String
```

## 5. Key 詳細說明

### 全局 Keys

| Key | Type | TTL | 說明 |
|-----|------|-----|------|
| `momentry:health:current` | String | 60s | 當前健康狀態 |
| `momentry:health:services` | Hash | 60s | 依賴服務健康狀態 |
| `momentry:stats:total_jobs` | String | - | 總 Jobs 數 |
| `momentry:stats:processed_today` | String | 86400s | 今日處理數 |
| `momentry:stats:cpu:current` | String | 10s | 當前 CPU 使用 |
| `momentry:stats:memory:current` | String | 10s | 當前 Memory 使用 |
| `momentry:jobs:active` | Set | - | 運行中 Job UUIDs |
| `momentry:jobs:completed` | Set | - | 完成 Job UUIDs |
| `momentry:jobs:failed` | Set | - | 失敗 Job UUIDs |

### Per-Video Keys

| Key | Type | TTL | 說明 |
|-----|------|-----|------|
| `momentry:job:{uuid}` | Hash | 24h | Job 完整狀態 |
| `momentry:job:{uuid}:status` | String | 24h | Job 狀態 |
| `momentry:progress:{uuid}` | Pub/Sub | - | 即時進度頻道 |
| `momentry:result:{uuid}` | Hash | 24h | 處理結果 |
| `momentry:output:{uuid}` | String | 24h | 輸出路徑 |
| `momentry:metrics:{uuid}:cpu` | List | 1h | CPU 歷史 (100條) |
| `momentry:metrics:{uuid}:memory` | List | 1h | Memory 歷史 (100條) |
| `momentry:metrics:{uuid}:duration` | String | 24h | 處理時長 |
| `momentry:log:{uuid}` | String | 24h | 處理日誌 |

### Per-Processor Keys

| Key | Type | TTL | 說明 |
|-----|------|-----|------|
| `momentry:job:{uuid}:processor:{name}` | Hash | 24h | Processor 狀態 |
| `momentry:job:{uuid}:processor:{name}:status` | String | 24h | 狀態 |
| `momentry:job:{uuid}:processor:{name}:progress` | String | 24h | 進度百分比 |
| `momentry:job:{uuid}:processor:{name}:current` | String | 24h | 當前項目 |
| `momentry:job:{uuid}:processor:{name}:total` | String | 24h | 總項目數 |
| `momentry:job:{uuid}:processor:{name}:started_at` | String | 24h | 開始時間 |

## 6. TTL 策略

| Key 類型 | TTL | 原因 |
|----------|-----|------|
| Health | 60s | 需要定期更新 |
| Job | 24h | 處理完成後保留一天 |
| Processor | 24h | 處理完成後保留一天 |
| Metrics | 1h | 只保留近期歷史 |
| Progress Pub/Sub | - | 不持久，僅即時訊息 |
| Stats | 無 | 持久統計 |

## 7. 訊息格式

### Pub/Sub 訊息 (progress:{uuid})

```json
{
  "type": "info | progress | complete | error",
  "processor": "yolo | ocr | face | pose | cut | asr | asrx",
  "timestamp": 1700000000,
  "data": {
    "message": "Processing frame 5000",
    "current": 5000,
    "total": 14315
  }
}
```

### Job 狀態 Hash

```json
{
  "uuid": "5dea6618a606e7c7",
  "video_path": "/path/to/video.mp4",
  "status": "running",
  "current_processor": "yolo",
  "progress_total": 70,
  "progress_current": 50,
  "started_at": 1700000000,
  "updated_at": 1700000100,
  "error_count": 0,
  "last_error": ""
}
```

### Processor 狀態 Hash

```json
{
  "name": "yolo",
  "status": "running",
  "progress": 70,
  "current_frame": 10000,
  "total_frames": 14315,
  "started_at": 1700000000,
  "updated_at": 1700000100
}
```

## 8. 實作函數 (Rust)

所有 Redis Key 生成函數使用 `REDIS_KEY_PREFIX` 靜態變數：

```rust
use crate::core::config::REDIS_KEY_PREFIX;

fn global_key(key: &str) -> String {
    format!("{}{}", REDIS_KEY_PREFIX, key)
}

fn job_key(uuid: &str) -> String {
    format!("{}job:{}", REDIS_KEY_PREFIX, uuid)
}

fn processor_key(uuid: &str, processor: &str) -> String {
    format!("{}job:{}:processor:{}", REDIS_KEY_PREFIX, uuid, processor)
}

fn progress_channel(uuid: &str) -> String {
    format!("{}progress:{}", REDIS_KEY_PREFIX, uuid)
}

fn metrics_key(uuid: &str, metric: &str) -> String {
    format!("{}metrics:{}:{}", REDIS_KEY_PREFIX, uuid, metric)
}

fn jobs_set_key(status: &str) -> String {
    format!("{}jobs:{}", REDIS_KEY_PREFIX, status)
}
```

**注意**: `REDIS_KEY_PREFIX` 定義於 `src/core/config.rs`，由環境變數 `MOMENTRY_REDIS_PREFIX` 控制。

## 9. 環境變數

```bash
# Redis 連接
REDIS_URL=redis://localhost:6379
REDIS_PASSWORD=accusys
REDIS_DB=0

# Redis Key Prefix (可選，預設: momentry:)
MOMENTRY_REDIS_PREFIX=momentry:

# 生產環境範例 (.env)
MOMENTRY_SERVER_PORT=3002
MOMENTRY_REDIS_PREFIX=momentry:

# 開發環境範例 (.env.development)
MOMENTRY_SERVER_PORT=3003
MOMENTRY_REDIS_PREFIX=momentry_dev:
```

## 11. 監控腳本

使用 Redis 進行監控的腳本應參考：

- `monitor/service/momentry_redis_monitor.sh` - Redis 健康檢查
- `monitor/service/momentry_job_monitor.sh` - Job 狀態監控
