Sayt sekinlasha boshlaganda, ko'pincha aybdor ma'lumotlar bazasi bo'ladi: har bir sahifa ochilganda o'nlab bir xil so'rovlar qayta-qayta bajariladi. Redis bu muammoni hal qilishning eng mashhur vositalaridan biri. U ma'lumotlarni operativ xotirada kalit va qiymat ko'rinishida saqlaydi va millisekundlarda javob beradi. Ushbu maqolada Redis'ni ikki asosiy vazifa, ya'ni sessiyalar va kesh uchun qanday ishlatish, hostingda nimalarni tekshirish va serverni qanday xavfsiz sozlashni ko'rib chiqamiz.
Redis aslida nima va qachon foyda beradi
Redis xotirada ishlaydigan ma'lumotlar ombori. MySQL ma'lumotni diskda jadvallar ko'rinishida saqlasa, Redis uni xotirada oddiy kalitlar bilan ushlaydi, masalan catalog:home kaliti ostida bosh sahifadagi mahsulotlar ro'yxati. Har bir kalitga yashash muddati (TTL) berish mumkin, muddat tugagach kalit o'zi o'chadi. Shu xususiyat uni kesh va sessiyalar uchun juda qulay qiladi.
Lekin Redis har qanday saytni avtomatik tezlashtirmaydi. Kuniga bir necha yuz tashrif bo'ladigan vizitka sayt uchun PHP'ning OPcache'i va sahifa keshi ko'proq foyda beradi. Redis bazaga ko'p murojaat qiladigan, tizimga kirgan foydalanuvchilari ko'p bo'lgan yoki bir nechta server ishlatadigan loyihalarda o'zini oqlaydi: internet-do'kon, o'quv platformasi, CRM tizimi.
Misol: aksiya kunidagi internet-do'kon
Toshkentdagi maishiy texnika do'koni chegirma e'lon qildi va bir soat ichida tashriflar bir necha baravar oshdi. Bosh sahifadagi "eng ko'p sotilgan" bloki har ochilishda bir necha jadvalni birlashtiruvchi og'ir SQL so'rovni bajaradi. Natijada MySQL yuklanib, sahifa 4-5 soniyada ochiladi. Bu ro'yxat har daqiqada o'zgarmaydi, shuning uchun uni 10 daqiqaga Redis'da saqlash mumkin: birinchi foydalanuvchi uchun so'rov bajariladi, keyingi minglab foydalanuvchilar esa tayyor natijani xotiradan oladi.
<?php
$r = new Redis();
$r->connect('127.0.0.1', 6379);
$r->auth('UzunVaMurakkabParol_2026');
$key = 'catalog:home';
$data = $r->get($key);
if ($data === false) {
$data = json_encode(load_products_from_mysql());
$r->setex($key, 600, $data); // 10 daqiqa saqlanadi
}
$products = json_decode($data, true);
Bu yerda kalit topilmasa, ma'lumot bazadan olinadi va setex bilan 600 soniyaga yoziladi. Narx o'zgarganda kalitni darhol o'chirish ham mumkin ($r->del('catalog:home')), shunda keyingi so'rov yangi ma'lumotni yuklaydi.
Oddiy hostingda Redis bormi
Oddiy (virtual) hostingda Redis mavjudligi tarifga va server sozlamasiga bog'liq. Ba'zi hostinglarda har bir foydalanuvchiga alohida Redis jarayoni yoki unix-soket beriladi, boshqalarida umuman bo'lmaydi. Avval PHP'da redis kengaytmasi yoqilganini tekshiring, buni phpinfo() sahifasi yoki boshqaruv panelidagi PHP kengaytmalari ro'yxatidan ko'rish mumkin. Redis xizmati sizning tarifingizda bormi va qanday ulanish manzili ishlatiladi, bu haqda sayt.uz kabinetidan yoki texnik yordam orqali aniqlang.
Agar Redis'ni to'liq nazorat qilish, xotira hajmini o'zingiz belgilash va boshqa dasturlar bilan birga ishlatish kerak bo'lsa, VPS qulayroq. Quyidagi sozlamalar VPS yoki o'z serveringiz uchun yozilgan.
VPS'da o'rnatish va xavfsiz sozlash
Ubuntu yoki Debian'da Redis va PHP kengaytmasi standart paketlardan o'rnatiladi. O'rnatgandan keyin eng birinchi ish uni tashqi tarmoqdan yopishdir. Internetga ochiq, parolsiz Redis serverlari muntazam ravishda avtomatik skanerlar tomonidan topiladi va buziladi, shuning uchun bu qadamni hech qachon keyinga qoldirmang.
sudo apt install redis-server php-redis
sudo systemctl enable --now redis-server
redis-cli -a 'UzunVaMurakkabParol_2026' ping # PONG
php -m | grep -i redis # redis
# /etc/redis/redis.conf (asosiy qatorlar)
bind 127.0.0.1 ::1
protected-mode yes
port 6379
requirepass UzunVaMurakkabParol_2026
maxmemory 256mb
maxmemory-policy volatile-lru
bind qatori Redis faqat serverning o'zidan ulanishni qabul qilishini bildiradi, requirepass esa parol talab qiladi. Brandmauerda 6379-portni tashqariga ochmang. maxmemory Redis egallaydigan xotira chegarasini belgilaydi: chegara bo'lmasa, kesh o'sib borib serverdagi boshqa xizmatlarni siqib chiqarishi mumkin. O'zgarishlardan keyin sudo systemctl restart redis-server bilan qayta ishga tushiring.
Xotira to'lganda nima bo'ladi: siyosatni to'g'ri tanlash
maxmemory-policy xotira to'lganda qaysi kalitlar o'chirilishini belgilaydi va bu sessiyalar uchun juda muhim. allkeys-lru eng uzoq vaqt ishlatilmagan istalgan kalitni o'chiradi, sof kesh uchun bu yaxshi tanlov. Biroq Redis'da sessiyalar ham saqlansa, bu siyosat foydalanuvchi sessiyasini ham o'chirib yuborishi mumkin va mijoz savatchasi yoki tizimga kirgan holati to'satdan yo'qoladi.
Sessiya va kesh bitta Redis'da bo'lsa, volatile-lru xavfsizroq: u faqat muddati belgilangan kalitlardan tanlab o'chiradi. Eng ishonchli yo'l esa sessiyalar va kesh uchun ikki alohida Redis nusxasini ishlatish, chunki turli raqamli bazalar (-n 1, -n 2) xotira chegarasini baribir umumiy bo'lishadi. Sof kesh uchun diskka saqlashni o'chirib qo'yish ham mumkin, sessiyalar uchun esa standart saqlash sozlamalarini qoldirgan ma'qul.
PHP sessiyalarini Redis'ga ko'chirish
Standart holatda PHP sessiyalarni diskda fayl sifatida saqlaydi. Bitta serverli saytda bu odatda yetarli, lekin bir nechta server yoki fayllar soni juda ko'p bo'lganda Redis qulayroq. phpredis kengaytmasi bilan buning uchun ikki qator kifoya:
; php.ini yoki pool sozlamasi
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=UzunVaMurakkabParol_2026&database=1"
PHP-FPM'ni qayta ishga tushirgandan keyin saytga kirib, sessiya kalitlari paydo bo'lganini tekshiring. phpredis sessiya kalitlariga PHPREDIS_SESSION: prefiksini qo'shadi.
redis-cli -a 'UzunVaMurakkabParol_2026' -n 1 --scan --pattern 'PHPREDIS_SESSION:*' | head
redis-cli -a 'UzunVaMurakkabParol_2026' info memory | grep used_memory_human
WordPress va Laravel'da yoqish
WordPress'da Redis odatda "Redis Object Cache" plagini orqali ulanadi. Plaginni o'rnatishdan oldin wp-config.php fayliga ulanish parametrlarini yozing, keyin plagin sozlamalaridan keshni yoqing. Bitta Redis'da bir nechta sayt bo'lsa, har biriga alohida prefiks bering, aks holda kalitlar aralashib ketadi.
// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', 'UzunVaMurakkabParol_2026');
define('WP_REDIS_DATABASE', 2);
define('WP_REDIS_PREFIX', 'misol_uz:');
Laravel'da Redis o'rnatilgan imkoniyat sifatida qo'llab-quvvatlanadi, faqat .env faylini to'g'rilash va konfiguratsiya keshini yangilash (php artisan config:clear) kerak.
# .env
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=UzunVaMurakkabParol_2026
CACHE_STORE=redis # Laravel 11+ (eski versiyalarda CACHE_DRIVER)
SESSION_DRIVER=redis
Redis'ni yoqqandan keyin bir necha kun davomida sahifa ochilish vaqtini va MySQL yuklamasini kuzating. Natija sezilmasa, demak sekinlik boshqa joyda, masalan rasmlar hajmida yoki sekin tashqi API'da, va Redis bu holda asosiy yechim emas.