🔴
Хостинг

Redis билан кешлаш стратегиялари: иловани тезлаштириш

14.01.2025
← Барча мақолалар

Иловангиз ҳар бир сўровда маълумотлар базасига мурожаат қилса, фойдаланувчилар сони ортиши билан тизим секинлаша бошлайди. Диск асосидаги базалар ишончли, бироқ ҳар бир ўқиш операцияси дискдан маълумот олишни, индексларни қидиришни ва натижани қайтаришни талаб қилади. Ана шу ерда кешлаш ёрдамга келади ва Redis бугунги кунда энг машҳур ечимлардан бири ҳисобланади. Ушбу мақолада Redis нима эканлигини, қандай кешлаш стратегиялари мавжудлигини ва уларни амалда қандай қўллашни код мисоллари билан кўриб чиқамиз.

Redis нима ва нега у тез ишлайди

Redis (Remote Dictionary Server) — бу хотира-ичи (in-memory) калит-қиймат маълумотлар омбори бўлиб, барча маълумотларни оператив хотирада сақлайди. Анъанавий базалар маълумотни қаттиқ дискда сақлагани учун унга мурожаат қилиш миллисекундлар олади, Redis эса хотирадан ўқиганлиги сабабли жавобни микросекундларда қайтаради. Бу фарқ оддий кўринса-да, юқори юкламали тизимларда юзлаб марта тезроқ ишлаш имконини беради. Redis шунчаки кеш эмас: у қаторлар, рўйхатлар, тўпламлар, хешлар ва ҳатто навбатлар билан ишлай оладиган тўлақонли маълумотлар тузилмаси сервери.

Кешлашнинг асосий ғояси содда: тез-тез сўраладиган, лекин камдан-кам ўзгарадиган маълумотни базадан эмас, балки тезкор хотирадан қайтариш. Масалан, асосий саҳифадаги маҳсулотлар рўйхати ҳар сонияда минглаб марта сўралиши мумкин, аммо у кунига бир-икки марта янгиланади. Бу рўйхатни ҳар сафар базадан тортиб олиш ўрнига Redis'да сақлаш база юкини кескин камайтиради ва саҳифа юкланишини тезлаштиради. Натижада сервер ресурслари тежалади ва фойдаланувчи қулайлиги ошади.

Асосий кешлаш стратегиялари

Кешни қандай тўлдириш ва янгилаш бўйича бир нечта ёндашув мавжуд бўлиб, ҳар бири ўзига хос вазиятларга мос келади. Энг кўп қўлланиладигани — cache-aside (ён кеш) усули. Бунда илова аввал кешга мурожаат қилади, агар маълумот топилса дарҳол қайтаради, топилмаса базадан олади ва кейинги сафар учун кешга ёзиб қўяди. Бу стратегия соддалиги ва мослашувчанлиги туфайли энг кенг тарқалган, чунки илова кешни тўлиқ назорат қилади.

Write-through (ёзиш орқали ўтиш) стратегиясида ҳар бир ёзув операцияси бир вақтнинг ўзида ҳам кешга, ҳам базага ёзилади. Бу кеш ва база доимо бир хил ҳолатда бўлишини таъминлайди, яъни маълумот ҳеч қачон эскирмайди. Камчилиги шундаки, ҳар бир ёзиш икки марта амалга ошганлиги сабабли ёзув операциялари бироз секинроқ бўлади. Write-behind (орқада ёзиш) эса аксинча: маълумот аввал фақат кешга ёзилади, базага эса кейинроқ, навбат орқали асинхрон тарзда ўтказилади. Бу ёзиш тезлигини оширади, аммо агар сервер ишдан чиқса, ҳали базага етиб бормаган маълумот йўқолиши хавфи мавжуд.

TTL ва eviction: хотирани бошқариш

Redis бутун маълумотни хотирада сақлаганлиги сабабли хотира чекланган ресурс ҳисобланади ва уни оқилона бошқариш зарур. Бу ерда TTL (Time To Live — яшаш вақти) тушунчаси муҳим рол ўйнайди. Ҳар бир калитга муддат белгилаб қўйиш мумкин, масалан, 300 сониядан кейин калит автоматик ўчирилади. Бу эскирган маълумотнинг чексиз яшашининг олдини олади ва кешнинг доимо янгиланиб туришини таъминлайди. Тўғри танланган TTL кешлаш стратегиясининг юрагидир.

Агар хотира тўлиб қолса, Redis eviction (чиқариб ташлаш) сиёсатига кўра қайси калитларни ўчиришни ҳал қилади. Энг машҳур сиёсат — LRU (Least Recently Used), яъни энг кам ишлатилган калитлар биринчи бўлиб ўчирилади. Бошқа вариантлар орасида LFU (энг кам частотада ишлатилган) ва тасодифий ўчириш ҳам бор. Ушбу созламаларни иловангиз эҳтиёжига қараб танлаш хотирани самарали ишлатишга ёрдам беради.

Амалий код мисоли

Қуйида cache-aside стратегиясининг оддий Python мисолини кўриб чиқамиз. Бу код аввал Redis'дан маълумотни қидиради ва фақат топилмаган тақдирдагина базага мурожаат қилади:

import redis
import json

r = redis.Redis(host="localhost", port=6379, db=0)

def get_user(user_id):
    cache_key = f"user:{user_id}"
    cached = r.get(cache_key)
    if cached:
        return json.loads(cached)

    # Keshda yo'q - bazadan olamiz
    user = db_query("SELECT * FROM users WHERE id = %s", user_id)

    # Keshga 300 soniyaga yozamiz (TTL)
    r.setex(cache_key, 300, json.dumps(user))
    return user

Redis шунингдек rate limiting (сўровларни чеклаш) учун ҳам ажойиб восита. INCR буйруғи ёрдамида ҳар бир фойдаланувчи қанча сўров юборганини санаб бориш ва белгиланган чегарадан ошиб кетса блоклаш мумкин:

def is_rate_limited(user_id, limit=100):
    key = f"rate:{user_id}"
    count = r.incr(key)
    if count == 1:
        r.expire(key, 60)  # 60 soniyalik oyna
    return count > limit

Redis қаерда қўлланилади

Кешлашдан ташқари Redis кўплаб вазифаларда фойдали. Сессияларни сақлаш учун у идеал ечим, чунки сессия маълумотлари тез ўқилиши ва ёзилиши керак, ҳамда табиий равишда муддатга эга. Саҳифа кеши, энг сўнгги янгиликлар рўйхати ёки машҳур маҳсулотлар рейтинги каби кўп ўқиладиган маълумотлар ҳам Redis'да яхши сақланади. Бундан ташқари, Redis List ва Stream тузилмалари ёрдамида фон вазифалари учун навбатлар (queue) қуриш мумкин, бу оғир операцияларни асинхрон бажаришга имкон беради.

Кучли томонлари ва эҳтиёт чоралари

Redis'нинг энг катта афзаллиги — тезлиги ва соддалиги, аммо уни қўллашда бир нечта хавфни ёдда тутиш керак. Энг кенг тарқалган муаммо — эскирган маълумот (stale data): агар базадаги ёзув ўзгарган бўлса, лекин кеш ҳали янгиланмаган бўлса, фойдаланувчи нотўғри маълумотни кўради. Буни TTL'ни тўғри созлаш ёки ёзув ўзгарганда кешни фаол равишда ўчириш (invalidation) орқали ҳал қилиш мумкин. Иккинчи муҳим жиҳат — хотира: Redis ҳамма нарсани хотирада сақлагани учун кешланадиган маълумот ҳажмини назорат қилиш ва eviction сиёсатини тўғри танлаш зарур.

sayt.uz хостингида Redis'ни ўрнатиш ва созлаш backend иловангизнинг унумдорлигини сезиларли даражада оширади. Тўғри танланган стратегия, мантиқий TTL қийматлари ва кешни ўз вақтида янгилаш орқали сиз база юкини бир неча баробар камайтиришингиз ва фойдаланувчиларга тезкор жавоб беришингиз мумкин. Redis билан ишлашни cache-aside каби оддий усулдан бошланг ва иловангиз ўсиши билан мураккаброқ стратегияларга ўтинг — бу сизнинг лойиҳангизнинг тезлиги ва ишончлилигини узоқ муддатга таъминлайди.

Ўхшаш мақолалар

💰 Хостинг нарх таққослаш 📡 Сервер мониторинг воситалари 🌐 Edge computing хостинг 🏢 Colocation сервер
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский 🇬🇧 English