ردیس
Redis
دیتابیس in-memory سریع برای caching، rate limiting، queues و real-time messaging
نمای کلی
نود Redis چیست؟
نود Redis امکان اتصال و کار با Redis (Remote Dictionary Server) را در n8n فراهم میکند. Redis یک data structure server با سرعت فوقالعاده بالاست.
چرا Redis؟
- سرعت فوقالعاده: عملیات در کمتر از ۱ میلیثانیه (in-memory)
- Data Structures: پشتیبانی از String, List, Set, Sorted Set, Hash, Stream
- TTL (Time-to-Live): expiry خودکار برای keys
- Pub/Sub: سیستم پیامرسانی real-time
- Atomic Operations: عملیاتهای thread-safe
- Persistence: ذخیره داده روی دیسک (RDB/AOF)
- Cluster: مقیاسپذیری افقی
قابلیتهای کلیدی در n8n:
- Key-Value Operations: GET, SET, DELETE, EXISTS
- TTL Management: تنظیم و مدیریت زمان انقضا
- List Operations: Push, Pop, Range
- Set Operations: Add, Remove, Members, Intersection
- Hash Operations: مدیریت فیلدهای hash
- Pub/Sub: Publish و Subscribe پیامها
- Increment/Decrement: شمارندههای اتمیک
- Key Pattern: جستجو با pattern (KEYS, SCAN)
Redis در معماری n8n:
[Workflow A] → Redis SET → [Cache Layer] → Redis GET → [Workflow B]
[Workflow C] → Redis PUBLISH → [Channel] → Redis SUBSCRIBE → [Workflow D]
[API Request] → Redis INCR → [Rate Counter] → IF > limit → Blockاحراز هویت
احراز هویت Redis
اتصال ساده (بدون رمز)
- 1در n8n به Credentials بروید
- 2Redis را انتخاب کنید
- 3تنظیمات:
- **Host**: آدرس سرور (مثلاً
localhostیاredis.example.com) - **Port**: پورت (پیشفرض
6379) - **Database**: شماره دیتابیس (پیشفرض
0، بازه ۰-۱۵)
اتصال با رمز عبور
- 1مثل بالا + Password را وارد کنید
- 2در Redis config:
requirepass yourpassword
اتصال با ACL (Redis 6+)
- 1Username و Password را وارد کنید
- 2از Redis ACL برای مدیریت دسترسی granular استفاده کنید
اتصال با TLS/SSL
- 1TLS را فعال کنید
- 2اگر certificate خاصی دارید، آن را تنظیم کنید
- 3برای Redis Cloud و managed services معمولاً TLS لازم است
Connection String Format:
redis://username:password@host:port/database
redis://:password@localhost:6379/0
rediss://user:pass@host:6380/0 (with TLS)نصب Redis (Self-hosted):
Docker (توصیه شده):
docker run -d --name redis \
-p 6379:6379 \
-v redis_data:/data \
redis:alpine redis-server --requirepass "your_password" --appendonly yesبا Redis Stack (شامل JSON, Search, TimeSeries):
docker run -d --name redis-stack \
-p 6379:6379 \
-p 8001:8001 \
redis/redis-stack:latestسرویسهای Managed:
- Redis Cloud: رایگان تا ۳۰MB
- Upstash: serverless Redis (رایگان تا ۱۰K commands/day)
- AWS ElastiCache: managed Redis
- Azure Cache: managed Redis
⚠️ نکته ایران: Redis self-hosted روی سرور خودتان بهترین گزینه است.
عملیاتهای موجود
get
دریافت مقدار یک key
set
ذخیره یک مقدار با key
delete
حذف یک یا چند key
keys
جستجوی keys با pattern
incr
افزایش مقدار عددی key به میزان ۱ یا مقدار دلخواه
decr
کاهش مقدار عددی key
expire
تنظیم زمان انقضا برای key موجود
ttl
دریافت زمان باقیمانده تا انقضا
exists
بررسی وجود یک key
lpush
اضافه کردن مقدار به ابتدای لیست
rpush
اضافه کردن مقدار به انتهای لیست
lpop
برداشتن و حذف مقدار از ابتدای لیست
lrange
دریافت بازهای از لیست
sadd
اضافه کردن عضو به Set
smembers
دریافت همه اعضای Set
hset
ذخیره فیلد و مقدار در Hash
hget
دریافت مقدار یک فیلد از Hash
hgetall
دریافت همه فیلدها و مقادیر Hash
publish
انتشار پیام به یک channel (Pub/Sub)
کاربردهای متداول
کاربردهای رایج
۱. API Response Caching
نتایج APIهای کُند یا rate-limited را cache کنید تا سریعتر پاسخ دهید.
API Request → Redis GET (بررسی cache) → IF (exists?) →
Yes: استفاده از cache
No: HTTP Request → Redis SET (TTL: 3600) → ادامه workflow۲. Rate Limiting
محدود کردن تعداد درخواستها از هر IP یا کاربر.
Webhook → Redis INCR (key: rate:IP) → Redis EXPIRE (60 sec) →
IF (count > 100) → Response 429 Too Many Requests
ELSE → ادامه پردازش۳. Session Management
ذخیره و مدیریت sessionهای کاربران با TTL خودکار.
Login → Redis HSET (session:userId, {token, role, loginAt}) →
Redis EXPIRE (session:userId, 86400) → Response۴. Job Queue (صف کار)
صف پردازش تسکها با LPUSH/RPOP.
Producer: Webhook → Redis LPUSH (queue:emails, payload)
Consumer: Schedule (هر دقیقه) → Redis RPOP (queue:emails) → Email Send۵. Real-time Notifications (Pub/Sub)
ارسال اعلان real-time بین workflowها.
Workflow A: Event → Redis PUBLISH (channel: orders, message)
Workflow B: Redis SUBSCRIBE (channel: orders) → Telegram → Email۶. Distributed Lock
جلوگیری از اجرای همزمان یک workflow حساس.
Redis SET (lock:payment, 1, NX, EX 30) →
IF (success) → پردازش پرداخت → Redis DEL (lock:payment)
ELSE → Wait → Retry۷. Counter و Statistics
شمارش بازدید، لایک، دانلود و آمار real-time.
Webhook (page view) → Redis INCR (views:page:123) →
Redis INCR (views:daily:2024-01-15) → Response۸. Leaderboard (تابلو امتیازات)
مدیریت رتبهبندی با Sorted Sets.
Event (score) → Redis ZADD (leaderboard, score, userId) →
Redis ZREVRANGE (leaderboard, 0, 9) → Top 10 Users۹. Deduplication
جلوگیری از پردازش تکراری پیامها با Set.
Message → Redis SISMEMBER (processed, messageId) →
IF (not member) → پردازش → Redis SADD (processed, messageId)
ELSE → Skip۱۰. Feature Flags
مدیریت Feature flags برای فعال/غیرفعال کردن قابلیتها.
Redis HGETALL (features) → IF (feature:dark_mode = enabled) →
فعالسازی dark mode → Responseنکات حرفهای
نکات حرفهای
۱. Key Naming Convention
از الگوی یکسان برای نامگذاری keys استفاده کنید:
object-type:id:field
مثال: user:123:email, cache:api:weather, rate:ip:192.168.1.1۲. همیشه TTL تنظیم کنید
برای جلوگیری از پر شدن حافظه، همیشه TTL مناسب تنظیم کنید:
- Cache: ۱ ساعت تا ۱ روز
- Session: ۲۴ ساعت
- Rate limit: ۱ دقیقه
- Lock: ۳۰ ثانیه
۳. از Hash برای Objectها استفاده کنید
بجای serialize کردن JSON به string، از Hash استفاده کنید:
HSET user:123 name "علی" email "ali@example.com" age 30
HGET user:123 name → "علی"
HGETALL user:123 → {name, email, age}۴. INCR/DECR برای شمارنده
اتمیک و thread-safe هستند - مشکل race condition ندارند.
۵. NX Flag برای Lock
از SET key value NX EX 30 برای distributed lock استفاده کنید. NX یعنی فقط اگر key وجود ندارد.
۶. از SCAN بجای KEYS استفاده کنید
KEYS * سرور را block میکند. از SCAN با cursor استفاده کنید.
۷. Pipeline برای Batch
چندین command را با pipeline ارسال کنید تا round-trip کم شود.
۸. Maxmemory Policy
allkeys-lru: حذف least recently used (مناسب cache) volatile-lru: فقط keys با TTL حذف شوند noeviction: خطا بده وقتی حافظه پر شد
۹. Database Isolation
از دیتابیسهای مختلف (0-15) برای جداسازی استفاده کنید:
- DB 0: Application cache
- DB 1: Sessions
- DB 2: Rate limiting
- DB 3: Queues
۱۰. JSON Data
برای ذخیره JSON، از JSON.stringify/parse استفاده کنید:
SET → JSON.stringify({name: "علی", orders: [1,2,3]})
GET → JSON.parse(result)۱۱. Sorted Set برای Ranking
از ZADD و ZREVRANGE برای leaderboard و priority queue استفاده کنید.
۱۲. PUB/SUB برای Event-driven
از Pub/Sub برای ارتباط real-time بین workflowها استفاده کنید. بسیار سریعتر از polling است.
۱۳. FLUSHDB با احتیاط
FLUSHDB همه keys را پاک میکند. فقط در development استفاده کنید.
۱۴. Redis Persistence
- RDB: snapshot دورهای (سریعتر، ممکن است چند ثانیه داده از دست برود)
- AOF: ثبت هر operation (ایمنتر، فایل بزرگتر)
- بهترین: هر دو را فعال کنید
۱۵. Monitor Memory
redis-cli INFO memory را بررسی کنید. used_memory نباید از maxmemory بیشتر شود.
رفع مشکلات
رفع مشکلات رایج
❌ خطای "ECONNREFUSED" (اتصال رد شد)
علت: Redis server در دسترس نیست
راهحل
- مطمئن شوید Redis در حال اجراست:
redis-cli ping→ بایدPONGبرگرداند - Host و Port را بررسی کنید
- Firewall را بررسی کنید (پورت ۶۳۷۹)
- در Docker: از نام container بجای localhost استفاده کنید
❌ خطای "NOAUTH" یا "ERR invalid password"
علت: رمز عبور نادرست یا تنظیم نشده
راهحل
- رمز عبور را در credentials بررسی کنید
- اگر Redis بدون رمز است، فیلد password را خالی بگذارید
- در Redis 6+، username هم ممکن است لازم باشد
❌ خطای "WRONGTYPE Operation"
علت: نوع data structure نادرست (مثلاً GET روی List)
راهحل
- نوع key را بررسی کنید:
redis-cli TYPE mykey - برای String از GET/SET، برای List از LPUSH/LRANGE، و... استفاده کنید
- اگر نوع را عوض کردید، ابتدا key قبلی را DEL کنید
❌ خطای "OOM command not allowed"
علت: حافظه Redis پر شده
راهحل
maxmemoryوmaxmemory-policyرا تنظیم کنید- از
allkeys-lrupolicy برای حذف خودکار قدیمیها استفاده کنید - TTL تنظیم کنید تا keys خودکار منقضی شوند
- حافظه سرور را افزایش دهید
❌ Key پیدا نمیشود (nil)
علت: Key وجود ندارد یا منقضی شده
راهحل
- نام key را exact بررسی کنید (case-sensitive)
- TTL ممکن است تمام شده باشد
- Key ممکن است توسط workflow دیگری DEL شده باشد
- دیتابیس صحیح (0-15) را انتخاب کنید
❌ Performance ضعیف
علت: استفاده نادرست از Redis
راهحل
- از KEYS * در production استفاده نکنید (از SCAN استفاده کنید)
- از pipeline برای batch operations استفاده کنید
- مقادیر بسیار بزرگ (>1MB) را ذخیره نکنید
- از MONITOR در production استفاده نکنید
❌ دادهها پس از restart از بین میرود
علت: persistence تنظیم نشده
راهحل
- AOF را فعال کنید:
appendonly yes - یا RDB snapshots:
save 60 1000 - در Docker: volume mount کنید (
-v redis_data:/data)
❌ خطای "CROSSSLOT" (Redis Cluster)
علت: keys در slotهای مختلف هستند
راهحل
- از
{hashtag}در نام keys استفاده کنید - مثال:
user:{123}:nameوuser:{123}:emailدر یک slot هستند
