Redis دادهها را در حافظه نگه میدارد و در حدود یک میلیثانیه پاسخ میدهد، به همین دلیل پشت بسیاری از برنامهها بهعنوان کش، صف یا محل نگهداری نشستها کار میکند. نصبش یک فرمان است. کار اصلی در پیشفرضهاست: سقفی برای حافظه نیست، تصویرها ممکن است نوشتههای اخیر را از دست بدهند، و دو اشتباه ساده هست که بیصدا دادههایتان را پاک میکنند یا رمزتان را از کار میاندازند. این راهنما همهٔ اینها را روی Ubuntu 24.04 پوشش میدهد. همهٔ مراحل را روی ایمیج خودمان اجرا کردیم و عددها از یک سرور Micro (2 vCPU و 2 GB) آمدهاند.
به یک کاربر با sudo نیاز دارید. راهنمای راهاندازی Ubuntu یکی میسازد.
1. نصب
sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping
نصب 13 ثانیه طول کشید و Redis 7.0.15 را آورد. بلافاصله و در هر بوت اجرا میشود، با PONG پاسخ میدهد و فقط روی خود سرور گوش میدهد: 127.0.0.1:6379 و [::1]:6379، با protected-mode yes. بدون داده 13.5 MB رم مصرف میکرد.
در لاگ از همان ابتدا یک هشدار بود:
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
Redis از روی نسخهای از خودش که با fork ساخته میشود روی دیسک ذخیره میکند، و با تنظیم پیشفرض کرنل این fork ممکن است وقتی حافظه کم است شکست بخورد. یک بار درستش کنید:
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server
بعد از راهاندازی دوباره، هشدار رفته بود.
2. حافظهاش را محدود کنید
بهطور پیشفرض maxmemory برابر 0 است، یعنی بدون سقف، و سیاست noeviction است. Redis تا وقتی حافظهٔ سرور تمام شود رم برمیدارد. سقفی بگذارید و تصمیم بگیرید وقتی به آن رسید چه شود:
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE
هر دو سیاست را با سقف 64 MB و 400,000 نوشتن آزمودیم:
noeviction(پیشفرض): حافظه روی 63 MB ایستاد و نوشتنهای تازه با خطایOOM command not allowed when used memory > 'maxmemory'شکست خوردند. مناسب صف یا هر چیزی که نباید از دست برود.allkeys-lru: Redis کلیدهایی را که مدتها استفاده نشده بودند، 48,606 تا، دور ریخت و همهٔ نوشتنها انجام شد. مناسب کش.
CONFIG REWRITE تنظیمات جاری را در /etc/redis/redis.conf ذخیره میکند تا بعد از راهاندازی دوباره بمانند. همچنین سطری اضافه میکند که پیش از مرحلهٔ 4 باید از آن خبر داشته باشید.
3. روش ذخیره روی دیسک را انتخاب کنید
بهطور پیشفرض Redis بعد از 1 تغییر در یک ساعت، 100 تغییر در پنج دقیقه یا 10,000 تغییر در یک دقیقه یک تصویر (/var/lib/redis/dump.rdb) مینویسد. سه روش متوقف کردنش را آزمودیم:
| Redis چطور متوقف شد | فقط تصویر (پیشفرض) | با فایل AOF |
|---|---|---|
systemctl restart | چیزی از دست نرفت: هنگام خاموشی ذخیره میکند | چیزی از دست نرفت |
کشته شدن با kill -9 | کلید نوشتهشده بعد از آخرین تصویر از بین رفته بود | کلیدی که 2 ثانیه قبل نوشته شده بود سر جایش بود |
در هر دو حالت systemd ظرف چند ثانیه خودش Redis را دوباره بالا آورد.
اگر در Redis دادهای دارید که از دست دادنش برایتان مهم است، فایل AOF (append-only file) را روشن کنید. هر نوشتن را ثبت میکند و ثانیهای یک بار روی دیسک میریزد. این کار را روی سرور در حال اجرا انجام دهید، نه با ویرایش فایل:
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_
اول راه دیگر را امتحان کردیم و دادههایمان را از دست دادیم. در redis.conf مقدار appendonly no را به appendonly yes تغییر دادیم و دوباره راهاندازی کردیم. Redis با یک AOF خالی بالا آمد و از تصویر چیزی بار نکرد، پس همهٔ کلیدهای موجود از بین رفتند. بعد هم هنگام خاموشی، محتوای تازهاش را، بدون کلیدهای قدیمی، روی dump.rdb هم نوشت. CONFIG SET جلوی این را میگیرد: Redis اول AOF را از دادههای داخل حافظه مینویسد. بعد از راهاندازی دوباره، همهٔ کلیدهای ما سر جایشان بودند.
اگر Redis فقط یک کش است که میتواند خالی شروع کند، برعکس عمل کنید و ذخیره را با redis-cli CONFIG SET save "" خاموش کنید.
4. رمز بگذارید
تلهٔ دوم این است. بعد از هر CONFIG REWRITE، Redis 7 این سطر را به انتهای redis.conf اضافه میکند:
user default on nopass ~* &* +@all
معنایش این است: «کاربر پیشفرض به رمز نیاز ندارد». بعد ما requirepass را بالاتر در فایل اضافه کردیم و دوباره راهاندازی کردیم. Redis همچنان بدون رمز PONG میداد، چون سطر user بر آن غلبه میکند. رمز را از طریق خود Redis بگذارید:
REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE
رمز را جای امنی نگه دارید. Redis حالا آن را بهصورت هش SHA-256 در همان سطر user default نگه میدارد. بعد از راهاندازی دوباره، redis-cli ping پاسخ NOAUTH Authentication required. داد و فقط با رمز کار کرد. رمز را با متغیر REDISCLI_AUTH به redis-cli بدهید. با -a در فهرست فرایندها دیده میشود و redis-cli دربارهٔ آن هشدار میدهد. در برنامهتان آن را در نشانی Redis بگذارید: redis://:PASSWORD@127.0.0.1:6379/0.
5. دسترسی از کامپیوتر خودتان
Redis را روی 127.0.0.1 نگه دارید و از تونل SSH استفاده کنید. پورت SSH سرورتان را بدهید؛ در پلنهای NAT این پورت اختصاصی شماست:
ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22
تا وقتی این اجراست، redis-cli -p 6380 و ابزارهای دسکتاپ کامپیوترتان با Redis روی سرور حرف میزنند و چیز تازهای روی اینترنت باز نمیشود. با راهنمای کلیدهای SSH تونل بدون رمز وارد میشود.
چقدر سریع است
روی سرور آزمایشی Micro، redis-benchmark با 50 کلاینت این نتیجه را داد:
| آزمون | درخواست در ثانیه | میانهٔ تأخیر |
|---|---|---|
| SET | 30,303 | 1.0 ms |
| GET | 35,149 | 0.9 ms |
| SET، 16 فرمان در هر رفتوبرگشت | 272,109 | 2.4 ms |
| GET، 16 فرمان در هر رفتوبرگشت | 414,938 | 1.3 ms |
برای کش یا صف کارهای یک برنامهٔ وب، این خیلی بیشتر از نیاز شماست. سرعت اضافه از فرستادن فرمانها بهصورت دستهای (pipelining) میآید.
کدام پلن
Redis برای دادههایتان رم لازم دارد و چیز دیگری تقریبًا نه. Nano (2 vCPU، 1 GB، ماهی $3) با maxmemory 256mb Redis را کنار یک برنامهٔ کوچک اجرا میکند. Micro (2 GB، ماهی $5) برای کش بزرگتر و خود برنامه جا میگذارد. اگر چیز دیگری باید مستقیم به Redis وصل شود، IPv4 اختصاصی بگیرید (از Nano-IP با ماهی $8) و در فایروال فقط همان نشانی را مجاز کنید. همهٔ پلنها در صفحهٔ VPS هستند و پرداخت با USDT، USDC یا ETH روی شبکههای Base، Ethereum یا Polygon انجام میشود.
نظرات
هنوز نظری نیست. اولین نفر باشید.