Mundarija (27)
- Bu darsda
- 1. Nega bu kerak?
- 2. SET va GET
- 2.1 Asosiy yozish va o'qish
- 2.2 Bir nechta kalit birdan
- 3. TTL — kalitning yashash vaqti
- 3.1 EX va TTL
- 3.2 NX — faqat yo'q bo'lsa
- 3.3 Tuzoq: oddiy SET TTL'ni o'chiradi
- 3.4 EXPIRE va uning variantlari
- 3.5 Muddat qanday o'chiriladi
- 4. INCR — atomik hisoblagich
- 5. Kalit nomlash
- 5.1 Ikki nuqta bilan qismlar
- 5.2 Raqamli baza (SELECT 0–15) haqida
- 6. KEYS va SCAN
- 6.1 KEYS — bitta oqimni bloklaydi
- 6.2 SCAN — kursor bilan bo'lib
- 7. Ko'p uchraydigan xatolar
- 8. Mashqlar
- 1-mashq (oson): TTL javoblari
- 2-mashq (o'rta): kalit yasovchi
- 3-mashq (qiyin): TTL'li mini-ombor
- 9. Loyiha qadami: kanon tajribasi, loyihaga hali kirmaydi
- 10. Real ishda
- Xulosa
- Manbalar
Redis String va TTL: SET EX NX, INCR va kalit nomlash qoidalari
Qisqacha: String — Redis'ning eng oddiy turi: bitta kalit, bitta qiymat.
SET kalit qiymat EX 60— 60 soniyadan keyin kalit o'zi o'chadi (TTL),NX— faqat kalit yo'q bo'lsa yozadi.TTLjavobi: musbat son — qolgan soniya,-1— muddatsiz,-2— kalit yo'q. Tuzoq: oddiySETeski TTL'ni o'chiradi (kanon:-1), saqlash uchunKEEPTTL. Kalitlarilova:obyekt:id:maydonshaklida nomlanadi; ularni qidirish uchunKEYSemas,SCAN— kanondaKEYS200 000 kalitda serverni 42.9 ms to'xtatdi.
Bu darsda
SET,GET,DEL,MSET/MGET,GETDEL,EXISTSbilan ishlaysiz.EX,NX,KEEPTTL,EXPIRE … GTvaTTLjavoblarini tushuntira olasiz.INCRbilan atomik hisoblagich yasaysiz.- Kalitlarni tartibli nomlaysiz va
KEYSo'rnigaSCANishlatasiz.
Oldin bilishingiz kerak: Redis nima va ulanish.
Oldingi darsda Redis'ni Docker'da ishga tushirdik va Node'dan ulandik. Endi uning asosiy turini — satrni — har tomondan ko'ramiz. Hamma chiqishlar kanon redis-cli tajribasidan (Redis 8.10.2).
1. Nega bu kerak?
Aziz vazifalar ilovasiga kirdi. Server uning sessiyasini eslab qolishi kerak — lekin abadiy emas: 30 daqiqa harakatsiz qolsa, sessiya o'chsin. Postgres'da buni qilish uchun jadval, muddat ustuni va eskilarini o'chiradigan cron kerak bo'lardi.
Redis'da bitta buyruq: SET sessiya:abc123 … EX 1800. 30 daqiqadan keyin kalit o'zi yo'qoladi. Hech qanday tozalovchi yozish shart emas.
Ikkinchi vazifa: har vazifa necha marta ochilganini sanash. Postgres'da UPDATE … SET korishlar = korishlar + 1 — har ochilishda qator qulfi va yozuv. Redis'da INCR — xotirada, mikrosekundlarda.
O'xshatish: TTL — sut paketidagi "yaroqlilik muddati". Muddat tugagach, mahsulot javondan o'zi olib tashlanadi.
2. SET va GET
2.1 Asosiy yozish va o'qish
127.0.0.1:6379> SET vz:foydalanuvchi:1:ism Aziz Karimov
OK
127.0.0.1:6379> GET vz:foydalanuvchi:1:ism
Aziz Karimov
127.0.0.1:6379> TYPE vz:foydalanuvchi:1:ism
string
127.0.0.1:6379> STRLEN vz:foydalanuvchi:1:ism
12Kanon qiymatni qo'shtirnoq bilan bergan ("Aziz Karimov"). Skript chiqishida qo'shtirnoq ko'rinmaydi — oldingi darsdagi maslahatga qarang. TYPE — kalit qaysi turda. STRLEN — qiymat uzunligi baytda (bu yerda 12 ta lotin harfi — 12 bayt; kirill yoki emoji bo'lsa ko'proq).
String nomi chalg'itmasin: unga istalgan baytlarni yozish mumkin — matn, JSON, rasm. Bitta qiymat 512 MB gacha (hujjat). Amalda esa kichik qiymatlar saqlanadi — katta qiymat tarmoqni va bitta oqimli serverni band qiladi.
2.2 Bir nechta kalit birdan
127.0.0.1:6379> MSET vz:a 1 vz:b 2
OK
127.0.0.1:6379> MGET vz:a vz:b vz:c
1
2
127.0.0.1:6379> GETDEL vz:a
1
127.0.0.1:6379> EXISTS vz:a vz:b
1
127.0.0.1:6379> DEL vz:b vz:yoq
1MSET/MGET— bir nechta kalitni bitta buyruq va bitta tarmoq aylanishida yozish/o'qish. Yo'q kalit (vz:c) o'rnida bo'sh qator — interaktiv rejimda(nil), node-redis'danull.GETDEL— o'qib, darhol o'chiradi (bir martalik kod uchun qulay).EXISTS— nechtasi borligini qaytaradi:vz:aendi yo'q,vz:bbor —1.DEL— nechtasi o'chirilganini qaytaradi:vz:yoqyo'q edi —1.
Node'da (node-redis 6.3):
await redis.mSet({ "vz:a": "1", "vz:b": "2" });
const [a, b, c] = await redis.mGet(["vz:a", "vz:b", "vz:c"]);
// a, b — satrlar; yo'q kalit (c) o'rnida null3. TTL — kalitning yashash vaqti
3.1 EX va TTL
TTL (Time To Live — yashash vaqti) — kalit avtomatik o'chishiga qolgan vaqt. G'oya MongoDB indekslari darsidagi TTL indeks bilan bir xil, farqi — Redis muddatni har kalitga alohida qo'yadi.
127.0.0.1:6379> SET vz:sessiya:abc123 1 EX 60
OK
127.0.0.1:6379> TTL vz:sessiya:abc123
60
127.0.0.1:6379> PTTL vz:sessiya:abc123
59090EX 60— 60 soniya.PX 60000— xuddi shu, millisekundda.TTL— qolgan soniyalar,PTTL— millisekundlar. 59 090 — buyruqlar orasida ~0.9 s o'tgan (skriptdocker execbilan ishlagani uchun). Bu raqam har safar boshqacha — vaqtga bog'liq.
TTL'ning uchta javobini yodlang:
| Javob | Ma'nosi |
|---|---|
| musbat son | qolgan soniyalar |
-1 |
kalit bor, lekin muddati yo'q (abadiy) |
-2 |
kalit yo'q |
127.0.0.1:6379> TTL vz:yoq
-2Muddati tugagan kalit — yo'q kalit: GET bo'sh qaytaradi, TTL — -2.
3.2 NX — faqat yo'q bo'lsa
127.0.0.1:6379> SET vz:sessiya:abc123 2 NX
127.0.0.1:6379> SET vz:sessiya:yangi 3 NX EX 60
OKNX ("Not eXists") — kalit yo'q bo'lsagina yozadi. vz:sessiya:abc123 bor edi — javob bo'sh ((nil)), qiymat o'zgarmadi. Yangi kalitga — OK.
SET … NX EX — Redis'dagi eng muhim naqshlardan biri. U bitta atomik buyruqda "agar hech kim olmagan bo'lsa — men olaman, 60 soniyaga". Bu qulf (lock)ning asosi — Distributed lock va rate limit darsida to'liq quramiz. Teskarisi — XX: faqat kalit bor bo'lsa yozadi.
Maslahat: Eski kodda
SETNXvaSETEXbuyruqlarini uchratasiz. UlarSET … NXvaSET … EXning eski shakli. Hujjat yangi koddaSETparametrlarini tavsiya qiladi.
3.3 Tuzoq: oddiy SET TTL'ni o'chiradi
127.0.0.1:6379> SET vz:sessiya:abc123 4 KEEPTTL
OK
127.0.0.1:6379> TTL vz:sessiya:abc123
57
127.0.0.1:6379> SET vz:sessiya:abc123 5
OK
127.0.0.1:6379> TTL vz:sessiya:abc123
-1Diqqat bilan qarang. KEEPTTL bilan qiymat yangilandi, TTL saqlandi (57 — vaqt o'tdi). Keyin oddiy SET — va TTL -1 bo'ldi: kalit endi abadiy.
Bu real xato manbai. Sessiya ma'lumotini yangilab, SET qilsangiz — sessiya hech qachon tugamaydi. Xotira asta-sekin to'lib boradi. Qoida: muddatli kalitni yangilaganda doim EX ni qayta bering yoki KEEPTTL qo'ying.
stateDiagram-v2
[*] --> Yoq
Yoq --> Muddatli: SET EX 60
Yoq --> Abadiy: SET
Muddatli --> Muddatli: SET KEEPTTL
Muddatli --> Abadiy: oddiy SET yoki PERSIST
Abadiy --> Muddatli: EXPIRE
Muddatli --> Yoq: muddat tugadi yoki DEL
Abadiy --> Yoq: DELDiagrammaga qarang: "Muddatli" holatdan "Abadiy"ga o'tishning ikki yo'li bor. PERSIST — ataylab, oddiy SET — ko'pincha bexosdan.
3.4 EXPIRE va uning variantlari
127.0.0.1:6379> EXPIRE vz:korishlar:vazifa:7 30
1
127.0.0.1:6379> EXPIRE vz:korishlar:vazifa:7 300 GT
1
127.0.0.1:6379> TTL vz:korishlar:vazifa:7
300EXPIRE kalit soniya — mavjud kalitga muddat qo'yadi (1 — qo'yildi, 0 — kalit yo'q). Redis 7 dan qo'shimcha shartlar bor:
NX— faqat muddati yo'q bo'lsa qo'yadi;XX— faqat muddati bor bo'lsa;GT— yangi muddat kattaroq bo'lsa (300 > 30 — qo'yildi);LT— kichikroq bo'lsa.
EXPIRE … NX — hisoblagich naqshida juda kerak: "birinchi INCR da muddat qo'y, keyingilarida tegma". Uni Distributed lock va rate limit darsidagi rate limit'da ishlatamiz.
Tekshirib ko'ring:
SET a 1 EX 100, keyinSET a 2, keyinTTL a. Javob nima va nega?
Javob
-1. Ikkinchi SET parametrsiz — u kalitni yangidan yozadi va eski muddatni olib tashlaydi. Kalit endi abadiy. Muddatni saqlash uchun SET a 2 KEEPTTL kerak edi.
3.5 Muddat qanday o'chiriladi
Redis muddati o'tgan kalitlarni ikki yo'l bilan o'chiradi (hujjat): (1) kimdir kalitga murojaat qilsa — o'sha zahoti tekshiradi; (2) fonda sekundiga bir necha marta tasodifiy muddatli kalitlarni tekshiradi. Shuning uchun muddati o'tgan kalit xotirada qisqa vaqt qolishi mumkin. Lekin GET uni hech qachon qaytarmaydi.
4. INCR — atomik hisoblagich
127.0.0.1:6379> INCR vz:korishlar:vazifa:7
1
127.0.0.1:6379> INCRBY vz:korishlar:vazifa:7 10
11
127.0.0.1:6379> OBJECT ENCODING vz:korishlar:vazifa:7
int
127.0.0.1:6379> INCR vz:foydalanuvchi:1:ism
ERR value is not an integer or out of range- Yo'q kalitga
INCR—0dan boshlaydi va1qaytaradi. OldindanSET 0shart emas. INCRBY— istalgan songa,DECR/DECRBY— kamaytirish,INCRBYFLOAT— kasr son.OBJECT ENCODING … int— Redis bu satrni ichida son sifatida saqlayapti (tejamkor). Ichki kodlash Redis versiyasiga bog'liq — unga tayanmang.- Matnli qiymatga
INCR: "ERR qiymat butun son emas yoki chegaradan tashqarida". Chegara — 64 bitli ishorali son.
Nega INCR muhim? Oddiy JavaScript bilan "o'qi → +1 → yoz" qilsangiz, ikkita server bir vaqtda bir xil qiymatni o'qib, bitta oshirishni yo'qotadi. Bu poyga holati (race condition'lar). INCR esa bitta buyruq, Redis uni bo'lmasdan bajaradi. Kanon 100 parallel so'rovda buni o'lchadi: "o'qi-yoz" — natija 1, INCR — 100 (Atomiklik: MULTI, Lua va pipelining).
Node'da:
const soni = await redis.incr(`vz:korishlar:vazifa:${id}`);
// soni — son (number), satr emas5. Kalit nomlash
5.1 Ikki nuqta bilan qismlar
Redis'da jadval yoki papka yo'q — hamma kalit bitta katta ro'yxatda. Tartib faqat nomda. Umumiy an'ana — qismlarni : bilan ajratish:
vz:foydalanuvchi:1:ism
vz:sessiya:abc123
vz:korishlar:vazifa:7
vz:tashrif:2026-10-25ilova:obyekt:id:maydon. Birinchi qism — ilova prefiksi (vz — vazifalar). Bitta Redis'ni bir nechta ilova yoki xizmat ishlatsa, prefiks kalitlar to'qnashuvini oldini oladi va bitta ilovaning kalitlarini topishni osonlashtiradi.
Qoidalar:
- Bir xil tartib.
vz:foydalanuvchi:1vavz:1:foydalanuvchiaralashsa, keyinSCANnaqshi ishlamaydi. - Qisqa, lekin tushunarli. Har kalit nomi xotirada saqlanadi. Millionlab kalitda
vz:f:1vavazifalar_ilovasi:foydalanuvchi:1farqi megabaytlarga yetadi. Lekinx:1:akabi sirli nomlar — keyin hech kim tushunmaydi. - Foydalanuvchi kiritgan matnni kalitga to'g'ridan qo'ymang. Email ichida
:yoki*bo'lishi mumkin. Kerak bo'lsa — hash (masalansha1) yoki id. - Versiya qismi. Kesh formati o'zgarsa
vz:v2:...— eski kalitlar o'qilmay qoladi va TTL bilan o'ladi (Caching naqshlari).
5.2 Raqamli baza (SELECT 0–15) haqida
Redis'da 16 ta raqamli "baza" bor (SELECT 1). Ular faqat bitta serverda ishlaydi, Redis Cluster'da yo'q va ularni ajratish ishonchli emas. Zamonaviy amaliyot: hammasi 0 bazada, ajratish — prefiks bilan. Ilovalarni chindan ajratish kerak bo'lsa — alohida Redis instansi.
6. KEYS va SCAN
6.1 KEYS — bitta oqimni bloklaydi
"vz:sessiya: bilan boshlanadigan hamma kalitni topay" — birinchi xayolga KEYS vz:sessiya:* keladi. Kanon buni 200 000 kalitda sinadi:
127.0.0.1:6379> DBSIZE
200004Keyin KEYS vz:sinov:* ni berib, Redis'ning sekin buyruqlar jurnali (SLOWLOG) dan server ichidagi vaqtni oldi. Chiqishdan tegishli qatorlar:
127.0.0.1:6379> SLOWLOG GET 1
7
1792909439
42902
KEYS
vz:sinov:*7— jurnal yozuvi raqami,1792909439— vaqt (Unix soniya).42902— buyruq bajarilish vaqti mikrosekundda: 42.9 ms.
42.9 ms ko'p emasdek tuyuladi. Lekin eslang: Redis bitta oqimli. Shu 42.9 ms davomida boshqa hech bir mijozning buyrug'i bajarilmadi — hamma GET, SET, INCR kutdi. Kanondagi kesh hit 1.5 ms edi — bitta KEYS paytida u 30 baravar sekinlashadi. 10 million kalitli productionda bu soniyalar, butun sayt "qotadi".
Shuning uchun ko'p kompaniyalarda KEYS productionda o'chirib qo'yiladi (rename-command yoki ACL — Redis persistence va operatsiya).
6.2 SCAN — kursor bilan bo'lib
SCAN kalitlarni kichik bo'laklarda qaytaradi. Har chaqiruv — qisqa ish, orasida boshqa mijozlar xizmat oladi:
127.0.0.1:6379> SCAN 0 MATCH vz:sinov:1999* COUNT 1000
113792
Javob ikki qismli: kursor (113792) va shu bo'lakda topilgan kalitlar ro'yxati. Bu yerda ro'yxat bo'sh! Bu xato emas: Redis taxminan 1 000 ta kalitni ko'rib chiqdi, ularning hech biri naqshga mos kelmadi.
Qoidalar:
- Birinchi chaqiruv — kursor
0. - Keyingi chaqiruvga qaytgan kursorni bering.
- Kursor yana
0qaytsa — aylanib bo'ldi. - Bo'sh bo'lak — to'xtash sababi emas. Faqat kursor
0bo'lsa to'xtang. - Bitta kalit ikki marta kelishi mumkin (hujjat kafolati: aylanish davomida bor bo'lgan har kalit kamida bir marta keladi).
COUNT — "har qadamda taxminan nechta kalitni ko'r" maslahati, aniq son emas. Kanon redis-cli --scan --pattern 'vz:sinov:1999*' (u kursorni o'zi aylantiradi) bilan to'liq aylanib, 111 ta kalit topdi — KEYS bilan bir xil.
Node'da node-redis kursorni o'zi boshqaradi:
const topilgan = [];
for await (const kalitlar of redis.scanIterator({
MATCH: "vz:sinov:1999*",
COUNT: 1000,
})) {
topilgan.push(...kalitlar); // har qadam — massiv
}
console.log(topilgan.length);Ko'p kalitni o'chirish uchun DEL o'rniga UNLINK — u kalitni darhol ro'yxatdan olib tashlaydi, xotirani esa fonda bo'shatadi. Kanon 200 000 sinov kalitini --scan + UNLINK bilan tozaladi.
Tekshirib ko'ring: Hamkasbingiz
SCANsiklini shunday yozdi: "bo'lak bo'sh kelsa — kalitlar tugadi, to'xta". Kanon chiqishiga qarab, nima bo'ladi?
Javob
Kanonda birinchi bo'lakning o'zi bo'sh keldi, kursor esa 113792. Bunday sikl darhol to'xtab, 111 ta kalitning birontasini ham topmasdi. To'xtash sharti — faqat kursor 0.
7. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| Sessiyalar hech tugamaydi, xotira o'sadi | yangilashda oddiy SET TTL'ni o'chirdi |
EX ni qayta bering yoki KEEPTTL |
ERR value is not an integer |
matnli kalitga INCR |
hisoblagich uchun alohida kalit |
| Productionda sayt bir necha soniya qotadi | kimdir KEYS * berdi |
SCAN; KEYS ni o'chirib qo'ying |
SCAN hamma kalitni topmadi |
bo'sh bo'lakda to'xtagan | kursor 0 gacha davom eting |
| Ikki ilova kalitlari aralashib ketdi | prefiks yo'q | ilova:obyekt:id |
TTL -2 qaytaradi, kutilgan -1 |
kalit umuman yo'q (muddati o'tgan) | -2 — yo'q, -1 — abadiy |
8. Mashqlar
Mashqlar kurs/mashqlar/27/54-string/ da.
1-mashq (oson): TTL javoblari
- Kalit bor, muddati yo'q:
TTL→ - Kalit yo'q:
TTL→ - Faqat kalit yo'q bo'lsa yozadigan
SETparametri — - Qiymatni yangilab, muddatni saqlaydigan parametr —
- Productionda
KEYSo'rniga ishlatiladigan buyruq —
Yechim
- -1 — abadiy kalit; oddiy
SETdan keyin shunday bo'ladi. - -2 — yo'q yoki muddati o'tgan.
- NX — teskarisi
XX. - KEEPTTL — Redis 6.0 dan.
- SCAN — kursor bilan, bo'lib-bo'lib.
2-mashq (o'rta): kalit yasovchi
kalitYasa(...qismlar) funksiyasini yozing: qismlarni vz: prefiksi bilan : orqali birlashtirsin. Qism bo'sh satr bo'lsa yoki ichida :, *, bo'shliq bo'lsa — TypeError tashlasin (xabarida qism ko'rsatilsin). Sonlar ham qism bo'la oladi (String() bilan). Sinang: ("foydalanuvchi", 1, "ism"), ("tashrif", "2026-10-25"), ("sessiya", "a b").
Yechim
const PREFIKS = "vz";
function kalitYasa(...qismlar) {
const toza = qismlar.map(String);
for (const q of toza) {
if (q === "" || /[:*\s]/.test(q)) {
throw new TypeError(`noto'g'ri kalit qismi: "${q}"`);
}
}
return [PREFIKS, ...toza].join(":");
}
console.log(kalitYasa("foydalanuvchi", 1, "ism"));
console.log(kalitYasa("tashrif", "2026-10-25"));
try {
kalitYasa("sessiya", "a b");
} catch (e) {
console.log(e.message);
}Konsolda:
vz:foydalanuvchi:1:ism
vz:tashrif:2026-10-25
noto'g'ri kalit qismi: "a b"Hamma kalit bitta funksiyadan o'tsa — nomlash tartibi buzilmaydi va foydalanuvchi matni (masalan * bilan) SCAN naqshini buzmaydi. /[:*\s]/ — :, * yoki har qanday bo'shliq belgisi (RegExp asoslari va metodlari).
3-mashq (qiyin): TTL'li mini-ombor
Redis semantikasini Map bilan takrorlang. MiniOmbor klassi soat (hozirgi vaqtni ms da qaytaradigan funksiya) qabul qilsin va uchta metodga ega bo'lsin:
set(kalit, qiymat, { ex, nx, keepttl } = {})—nxbo'lsa va kalit bor bo'lsanull, aks holda"OK";ex— soniya;keepttl— eski muddatni saqlaydi; ikkalasi ham bo'lmasa — muddat o'chadi;get(kalit)— muddati o'tgan bo'lsanull(va kalitni o'chiradi);ttl(kalit)— kanondagi uch xil javob (qolgan soniyaniMath.ceilbilan).
Soxta soat bilan kanon ketma-ketligini takrorlang: SET … EX 60 → TTL → 3 s o'tdi → SET … NX → SET … KEEPTTL → TTL → oddiy SET → TTL → TTL yo'q kalit.
Yechim
class MiniOmbor {
#m = new Map();
#soat;
constructor(soat) {
this.#soat = soat;
}
#tirik(kalit) {
const y = this.#m.get(kalit);
if (y && y.tugash !== null && y.tugash <= this.#soat()) {
this.#m.delete(kalit);
return undefined;
}
return y;
}
set(kalit, qiymat, { ex, nx, keepttl } = {}) {
const eski = this.#tirik(kalit);
if (nx && eski) return null;
let tugash = null;
if (ex !== undefined) tugash = this.#soat() + ex * 1000;
else if (keepttl && eski) tugash = eski.tugash;
this.#m.set(kalit, { qiymat, tugash });
return "OK";
}
get(kalit) {
return this.#tirik(kalit)?.qiymat ?? null;
}
ttl(kalit) {
const y = this.#tirik(kalit);
if (!y) return -2;
if (y.tugash === null) return -1;
return Math.ceil((y.tugash - this.#soat()) / 1000);
}
}
let hozir = 0;
const r = new MiniOmbor(() => hozir);
const k = "vz:sessiya:abc123";
console.log(r.set(k, "1", { ex: 60 }), r.ttl(k));
hozir += 3000;
console.log(r.set(k, "2", { nx: true }), r.get(k));
console.log(r.set(k, "4", { keepttl: true }), r.ttl(k));
console.log(r.set(k, "5"), r.ttl(k), r.ttl("vz:yoq"));Konsolda:
OK 60
null 1
OK 57
OK -1 -2Natija kanon redis-cli chiqishi bilan bir xil: NX mavjud kalitda null (qiymat 1 qoldi), KEEPTTL muddatni saqladi (57), oddiy SET uni o'chirdi (-1). #tirik — "dangasa o'chirish" (murojaat paytida tekshirish), Redis'ning birinchi usuli. Soatni tashqaridan berish — testda vaqtni boshqarish usuli (Vaqt va tasodifni boshqarish).
9. Loyiha qadami: kanon tajribasi, loyihaga hali kirmaydi
vazifalar-api ga bu darsda kod qo'shilmaydi: sessiya — 28-qismda (auth), kesh — Caching naqshlari darsida. O'zingiz sinab ko'ring: redis-cli da sessiya kalitini EX 30 bilan yarating, TTL ni bir necha marta so'rang, keyin oddiy SET qilib TTL qanday o'zgarishini ko'ring. Kalit nomlashda shu darsdagi vz: tartibiga rioya qiling — keyingi darslarda shunday davom etamiz.
10. Real ishda
- Sessiya va bir martalik kodlar —
SET otp:<telefon> <kod> EX 120 NX(SMS kodi: 2 daqiqa, qayta so'rash bloklanadi). OTP'ni 28-qismda chuqur ko'ramiz. - Ko'rishlar va limitlar —
INCR+EXPIRE … NX. - Production qoidasi —
KEYSo'chirilgan; kalitlar prefiks bilan; har muddatli ma'lumotda TTL majburiy. - Intervyuda: "TTL
-1va-2farqi?", "NegaKEYSxavfli?", "SCAN qanday ishlaydi, kalit takrorlanishi mumkinmi?"
Xulosa
- String — bitta kalit, bitta qiymat (matn, JSON, son);
MSET/MGET— bir aylanishda ko'p kalit. SET … EX— muddat,NX— faqat yo'q bo'lsa,KEEPTTL— muddatni saqlash; oddiySETmuddatni o'chiradi.TTL: son — qolgan soniya,-1— abadiy,-2— yo'q.INCR— atomik hisoblagich, yo'q kalitda0dan boshlaydi.- Kalitlar:
ilova:obyekt:id:maydon;KEYSbitta oqimni bloklaydi (42.9 ms / 200 000 kalit) —SCANkursor0gacha.
Keyingi dars: Hash, List, Set va Sorted Set — vazifani maydonlari bilan saqlash, faollik lentasi, noyob tashrifchilar va reyting jadvali.
Manbalar
- Redis hujjati — SET (EX, NX, KEEPTTL, GET), EXPIRE (NX/XX/GT/LT), TTL: https://redis.io/docs/latest/commands/set/, https://redis.io/docs/latest/commands/expire/, https://redis.io/docs/latest/commands/ttl/
- KEYS va SCAN (kafolatlar, COUNT): https://redis.io/docs/latest/commands/keys/, https://redis.io/docs/latest/commands/scan/
- SLOWLOG: https://redis.io/docs/latest/commands/slowlog-get/
- Kanon o'lchovi (IlmHamroh, 2026-10): Redis 8.10.2 (Docker, WSL2),
redis-cli. Mashq yechimlari — biz ishga tushirdik (Node 24.21.0).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!