iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
生成式 AI

一起來打造 PTT 文章智慧問答系統!系列 第 9

【Day 09】認識 Celery & Redis - 認識、安裝與設定 Celery 與 Redis

  • 分享至 

  • xImage
  •  

Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com


今天的目標是帶你認識並實作兩個強大的工具:Celery 和 Redis,透過它們,我們可以將繁重的任務丟到背景執行,讓你的主應用保持流暢,也為未來的「定時排程」做好準備!

讓我們一步步從概念到實作,一起打造更高效的 Django 專案。


今日目標

  • 認識 Celery & Redis
  • 安裝與設定 Celery 與 Redis

什麼是 Celery?

Celery 是一個功能強大的 非同步任務隊列(task queue) 框架,支援:

  • 後台背景處理(如:發送通知、排程任務)
  • 定時任務(如:每天爬一次資料、每小時更新資料)
  • 可擴展、多 worker 並行處理

它與 Django 整合良好,可以讓你寫出如下這樣的任務:

@shared_task
def my_task():
    print("這是一個非同步任務")

然後這個任務就能在背景被執行,而不會阻塞主線程。


什麼是 Redis?

Redis 是一個 記憶體資料庫與訊息中介(Message Broker),常被用來:

  • 暫存資料(如快取系統)
  • 儲存佇列訊息(如 Celery 任務等待執行時)

在 Celery 架構中,Redis 扮演「任務訊息的排隊者與轉送者」,它會暫存你丟進 Celery 的任務,等 Celery Worker 來取用:

Django 發送任務 → Redis 存放任務 → Celery Worker 執行任務

安裝 Celery 與 Redis

那我們就開始實際操作試試看:

安裝套件

pip install celery redis

使用 docker-compose.yml 啟動 Redis

安裝套件後,請將 docker-compose.yml 改為以下內容,這樣部署時也會啟動 Redis 、 Celery 跟定時器 :

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: django_web
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - mariadb
      - redis

  mariadb:
    image: mariadb:11.7.2
    container_name: my_mariadb
    restart: always
    environment:
      MYSQL_DATABASE: my_database
      MYSQL_USER: ptt_rag
      MYSQL_PASSWORD: ptt_rag
      MYSQL_ROOT_PASSWORD: root

    ports:
      - "3307:3306"
    volumes:
      - ./mariadb_data:/var/lib/mysql

  redis:
    image: redis:latest
    container_name: my_redis
    restart: always
    ports:
      - "6379:6379"

  celery:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: celery_worker
    command: celery -A ptt_rag_dev worker -l info
    volumes:
      - .:/app
    depends_on:
      - mariadb
      - redis

  celery-beat:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: celery_beat
    command: celery -A ptt_rag_dev beat -l info
    volumes:
      - .:/app
    depends_on:
      - mariadb
      - redis

明日預告【Day 10】使用 Celery + Redis 建立非同步排程 - 實作排程與背景任務執行
接下來會把 Celery 跟 Redis 的排程任務時作完成,敬請期待~


上一篇
【Day 08】設計 Django Model 並連接資料庫 - 定義資料結構與模型
下一篇
【Day 10】使用 Celery + Redis 建立非同步排程 - 建立 Celery 設定與任務
系列文
一起來打造 PTT 文章智慧問答系統!13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言