Сайт секинлаша бошлаганда, кўпинча айбдор маълумотлар базаси бўлади: ҳар бир саҳифа очилганда ўнлаб бир хил сўровлар қайта-қайта бажарилади. Redis бу муаммони ҳал қилишнинг энг машҳур воситаларидан бири. У маълумотларни оператив хотирада калит ва қиймат кўринишида сақлайди ва миллисекундларда жавоб беради. Ушбу мақолада Redis'ни икки асосий вазифа, яъни сессиялар ва кеш учун қандай ишлатиш, хостингда нималарни текшириш ва серверни қандай хавфсиз созлашни кўриб чиқамиз.
Redis аслида нима ва қачон фойда беради
Redis хотирада ишлайдиган маълумотлар омбори. MySQL маълумотни дискда жадваллар кўринишида сақласа, Redis уни хотирада оддий калитлар билан ушлайди, масалан catalog:home калити остида бош саҳифадаги маҳсулотлар рўйхати. Ҳар бир калитга яшаш муддати (TTL) бериш мумкин, муддат тугагач калит ўзи ўчади. Шу хусусият уни кеш ва сессиялар учун жуда қулай қилади.
Лекин Redis ҳар қандай сайтни автоматик тезлаштирмайди. Кунига бир неча юз ташриф бўладиган визитка сайт учун PHP'нинг OPcache'и ва саҳифа кеши кўпроқ фойда беради. Redis базага кўп мурожаат қиладиган, тизимга кирган фойдаланувчилари кўп бўлган ёки бир нечта сервер ишлатадиган лойиҳаларда ўзини оқлайди: интернет-дўкон, ўқув платформаси, CRM тизими.
Мисол: акция кунидаги интернет-дўкон
Тошкентдаги маиший техника дўкони чегирма эълон қилди ва бир соат ичида ташрифлар бир неча баравар ошди. Бош саҳифадаги "энг кўп сотилган" блоки ҳар очилишда бир неча жадвални бирлаштирувчи оғир SQL сўровни бажаради. Натижада MySQL юкланиб, саҳифа 4-5 сонияда очилади. Бу рўйхат ҳар дақиқада ўзгармайди, шунинг учун уни 10 дақиқага Redis'да сақлаш мумкин: биринчи фойдаланувчи учун сўров бажарилади, кейинги минглаб фойдаланувчилар эса тайёр натижани хотирадан олади.
<?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);
Бу ерда калит топилмаса, маълумот базадан олинади ва setex билан 600 сонияга ёзилади. Нарх ўзгарганда калитни дарҳол ўчириш ҳам мумкин ($r->del('catalog:home')), шунда кейинги сўров янги маълумотни юклайди.
Оддий хостингда Redis борми
Оддий (виртуал) хостингда Redis мавжудлиги тарифга ва сервер созламасига боғлиқ. Баъзи хостингларда ҳар бир фойдаланувчига алоҳида Redis жараёни ёки unix-сокет берилади, бошқаларида умуман бўлмайди. Аввал PHP'да redis кенгайтмаси ёқилганини текширинг, буни phpinfo() саҳифаси ёки бошқарув панелидаги PHP кенгайтмалари рўйхатидан кўриш мумкин. Redis хизмати сизнинг тарифингизда борми ва қандай уланиш манзили ишлатилади, бу ҳақда sayt.uz кабинетидан ёки техник ёрдам орқали аниқланг.
Агар Redis'ни тўлиқ назорат қилиш, хотира ҳажмини ўзингиз белгилаш ва бошқа дастурлар билан бирга ишлатиш керак бўлса, VPS қулайроқ. Қуйидаги созламалар VPS ёки ўз серверингиз учун ёзилган.
VPS'да ўрнатиш ва хавфсиз созлаш
Ubuntu ёки Debian'да Redis ва PHP кенгайтмаси стандарт пакетлардан ўрнатилади. Ўрнатгандан кейин энг биринчи иш уни ташқи тармоқдан ёпишдир. Интернетга очиқ, паролсиз Redis серверлари мунтазам равишда автоматик сканерлар томонидан топилади ва бузилади, шунинг учун бу қадамни ҳеч қачон кейинга қолдирманг.
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 қатори Redis фақат сервернинг ўзидан уланишни қабул қилишини билдиради, requirepass эса парол талаб қилади. Брандмауэрда 6379-портни ташқарига очманг. maxmemory Redis эгаллайдиган хотира чегарасини белгилайди: чегара бўлмаса, кеш ўсиб бориб сервердаги бошқа хизматларни сиқиб чиқариши мумкин. Ўзгаришлардан кейин sudo systemctl restart redis-server билан қайта ишга туширинг.
Хотира тўлганда нима бўлади: сиёсатни тўғри танлаш
maxmemory-policy хотира тўлганда қайси калитлар ўчирилишини белгилайди ва бу сессиялар учун жуда муҳим. allkeys-lru энг узоқ вақт ишлатилмаган исталган калитни ўчиради, соф кеш учун бу яхши танлов. Бироқ Redis'да сессиялар ҳам сақланса, бу сиёсат фойдаланувчи сессиясини ҳам ўчириб юбориши мумкин ва мижоз саватчаси ёки тизимга кирган ҳолати тўсатдан йўқолади.
Сессия ва кеш битта Redis'да бўлса, volatile-lru хавфсизроқ: у фақат муддати белгиланган калитлардан танлаб ўчиради. Энг ишончли йўл эса сессиялар ва кеш учун икки алоҳида Redis нусхасини ишлатиш, чунки турли рақамли базалар (-n 1, -n 2) хотира чегарасини барибир умумий бўлишади. Соф кеш учун дискка сақлашни ўчириб қўйиш ҳам мумкин, сессиялар учун эса стандарт сақлаш созламаларини қолдирган маъқул.
PHP сессияларини Redis'га кўчириш
Стандарт ҳолатда PHP сессияларни дискда файл сифатида сақлайди. Битта серверли сайтда бу одатда етарли, лекин бир нечта сервер ёки файллар сони жуда кўп бўлганда Redis қулайроқ. phpredis кенгайтмаси билан бунинг учун икки қатор кифоя:
; 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'ни қайта ишга туширгандан кейин сайтга кириб, сессия калитлари пайдо бўлганини текширинг. phpredis сессия калитларига PHPREDIS_SESSION: префиксини қўшади.
redis-cli -a 'UzunVaMurakkabParol_2026' -n 1 --scan --pattern 'PHPREDIS_SESSION:*' | head
redis-cli -a 'UzunVaMurakkabParol_2026' info memory | grep used_memory_human
WordPress ва Laravel'да ёқиш
WordPress'да Redis одатда "Redis Object Cache" плагини орқали уланади. Плагинни ўрнатишдан олдин wp-config.php файлига уланиш параметрларини ёзинг, кейин плагин созламаларидан кешни ёқинг. Битта Redis'да бир нечта сайт бўлса, ҳар бирига алоҳида префикс беринг, акс ҳолда калитлар аралашиб кетади.
// 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'да Redis ўрнатилган имконият сифатида қўллаб-қувватланади, фақат .env файлини тўғрилаш ва конфигурация кешини янгилаш (php artisan config:clear) керак.
# .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'ни ёққандан кейин бир неча кун давомида саҳифа очилиш вақтини ва MySQL юкламасини кузатинг. Натижа сезилмаса, демак секинлик бошқа жойда, масалан расмлар ҳажмида ёки секин ташқи API'да, ва Redis бу ҳолда асосий ечим эмас.