Skip to content

Cấu trúc & Cấu hình Redis

Data Explorer sử dụng Redis làm lớp trung gian hiệu năng cao cho caching, hàng đợi (queues) và giới hạn lưu lượng (rate limiting).

Global Caching

Lưu trữ kết quả schema introspection và metadata để giảm tải cho database nguồn.

BullMQ Queues

Xử lý các workflow nền có hàng đợi, hiện thấy rõ nhất ở migration và các tác vụ async không nên chặn request chính.

Rate Limiting

Sử dụng ThrottlerStorageRedis để đồng bộ giới hạn API request trên toàn bộ cụm server.

Vai trò của Redis trong hệ thống

Trong Data Explorer, Redis không chỉ là cache đơn thuần mà là lớp phối hợp cho nhiều năng lực backend: cache, BullMQ, throttling, notifications, presence, và search index. Nói cách khác, nó là hạ tầng runtime thực thụ chứ không còn là “phần tăng tốc nếu có thì tốt”.

Xử lý tác vụ nền (BullMQ)

Khi một workflow không nên giữ request đồng bộ quá lâu, backend có thể đẩy job vào Redis để worker xử lý riêng. Trong repo hiện tại, dấu vết rõ nhất của mô hình này nằm ở migration queue và các tác vụ nội bộ async.

Đồng bộ hóa Trạng thái

Redis giúp đảm bảo rằng nếu bạn chạy 3 server backend (Scaling), giới hạn 100 requests/phút sẽ được áp dụng chính xác cho user đó trên cả 3 server.

Cấu trúc dữ liệu nội bộ

Data Explorer tổ chức dữ liệu trong Redis theo các tiền tố (prefixes) nhất quán để dễ quản lý và monitor.
PrefixModule sử dụngLoại dữ liệu
cache:*CacheManagerString / JSON (Schema metadata)
bull:*BullMQHash / List / Set (Job queue state)
throttler:*Rate LimiterInteger (Request counters)
presence:*Presence serviceHash + TTL / HSCAN presence reads
search_index:*Search serviceItem payloads + token candidate indexes

Các tiện ích Redis mới tránh dùng `KEYS` trên keyspace lớn. `RedisService.keys()` hiện là wrapper tương thích dùng `SCAN`, presence đọc hash bằng `HSCAN`, và global search tra candidate index thay vì parse toàn bộ tập item trong service layer.

Vòng đời tác vụ BullMQ

Các workflow queue-based như migration hoặc các tác vụ async dài hơn sẽ đi qua 3 giai đoạn chính trong Redis:
Waiting

Job được đưa vào Redis List và đợi Worker nhàn rỗi.

Active

Worker đang xử lý job. Redis giữ khóa (lock) để tránh xử lý trùng.

Completed

Job hoàn thành, kết quả được lưu tạm để Frontend polling.

Triển khai Redis với Docker

Cách nhanh nhất để chạy Redis cho môi trường dev hoặc self-host là dùng Docker Compose.
docker-compose.yml (extract)

redis:

image: redis:7-alpine

ports:

- "6379:6379"

command: redis-server --save 60 1 --loglevel warning

Tính năng nâng cao với Redis

Thông báo Real-time

Sử dụng Redis Pub/Sub kết hợp với SSE (Server-Sent Events) để đẩy thông báo ngay lập tức tới trình duyệt. Kênh Pub/Sub được partition theo user (`notifications:user:<id>`) để giảm broadcast thừa khi nhiều người dùng đang online.

Tìm kiếm Schema Toàn cục

Redis lưu trữ index metadata của tất cả các kết nối database. Điều này cho phép bạn tìm kiếm bảng hoặc view trên hàng chục database khác nhau chỉ trong vài mili giây.

Tối ưu hóa ERD Designer

Cùng một lớp search/index này cũng là nền để các bề mặt như ERD, global search, và các luồng chọn bảng có thể phản hồi nhanh mà không phải query lại metadata nguồn ở mỗi lần gõ:

  • Smart Suggestions: Cho phép gợi ý bảng hoặc thực thể liên quan dựa trên index đã sync trước đó.
  • Low Re-query Pressure: Việc tra cứu diễn ra trên lớp index Redis thay vì luôn phải chạm lại DB nguồn, giảm độ trễ và tải không cần thiết.

Ranh giới sản phẩm hiện tại

Redis hiện là hạ tầng, chưa phải workspace riêng

Trong codebase hiện tại, Redis phục vụ cache, queue, notification stream, presence, throttling và search index. Nó chưa được mở ra thành một Redis Explorer hoàn chỉnh cho người dùng cuối, nên docs phần này nên được đọc như tài liệu kiến trúc/vận hành hơn là hướng dẫn sử dụng một workspace Redis riêng.

Cấu hình & Kết nối

Backend sử dụng biến môi trường `REDIS_URL` để kết nối. Nếu không khai báo, mặc định sẽ dùng `redis://localhost:6379`.
Cấu hình trong .env

# URL kết nối Redis đầy đủ

REDIS_URL=redis://user:password@your-redis-host:6379

# Dùng Redis TLS (cho các managed services như Upstash / AWS)

REDIS_URL=rediss://default:yourpassword@name.upstash.io:6379

Khắc phục sự cố

Backend không thể khởi động do lỗi Redis?

Kiểm tra xem Redis đã chạy chưa (redis-cli ping). Đảm bảo firewall đã mở port 6379.

BullMQ job bị treo hoặc không xử lý?

Xác nhận Redis không bị đầy bộ nhớ (OOM). Bạn có thể cần xóa các job cũ bằng lệnh FLUSHDB nếu đang dev.

Lỗi Max connections?

Các cloud provider miễn phí thường giới hạn 10-20 connections. Hãy cân nhắc nâng cấp lên gói trả phí nếu app có nhiều user.

Sẵn sàng khám phá dữ liệu?

Tham gia cộng đồng trên GitHub để đóng góp cho IDE cơ sở dữ liệu địa phương thông minh nhất.

Mở Ứng dụng