IlmHamroh
JavaScript Full-stack/27-qism. Ma'lumotlar bazasi chuqur: Postgres, ORM, Mongo, Redis54/65-dars15 daqiqa
Mundarija (27)

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. TTL javobi: musbat son — qolgan soniya, -1 — muddatsiz, -2 — kalit yo'q. Tuzoq: oddiy SET eski TTL'ni o'chiradi (kanon: -1), saqlash uchun KEEPTTL. Kalitlar ilova:obyekt:id:maydon shaklida nomlanadi; ularni qidirish uchun KEYS emas, SCAN — kanonda KEYS 200 000 kalitda serverni 42.9 ms to'xtatdi.

Bu darsda

  • SET, GET, DEL, MSET/MGET, GETDEL, EXISTS bilan ishlaysiz.
  • EX, NX, KEEPTTL, EXPIRE … GT va TTL javoblarini tushuntira olasiz.
  • INCR bilan atomik hisoblagich yasaysiz.
  • Kalitlarni tartibli nomlaysiz va KEYS o'rniga SCAN ishlatasiz.

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

text
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
12

Kanon 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

text
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
1
  • MSET / 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'da null.
  • GETDEL — o'qib, darhol o'chiradi (bir martalik kod uchun qulay).
  • EXISTS — nechtasi borligini qaytaradi: vz:a endi yo'q, vz:b bor — 1.
  • DEL — nechtasi o'chirilganini qaytaradi: vz:yoq yo'q edi — 1.

Node'da (node-redis 6.3):

js
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 null

3. 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.

text
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
59090
  • EX 60 — 60 soniya. PX 60000 — xuddi shu, millisekundda.
  • TTL — qolgan soniyalar, PTTL — millisekundlar. 59 090 — buyruqlar orasida ~0.9 s o'tgan (skript docker exec bilan 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
text
127.0.0.1:6379> TTL vz:yoq
-2

Muddati tugagan kalit — yo'q kalit: GET bo'sh qaytaradi, TTL — -2.

3.2 NX — faqat yo'q bo'lsa

text
127.0.0.1:6379> SET vz:sessiya:abc123 2 NX

127.0.0.1:6379> SET vz:sessiya:yangi 3 NX EX 60
OK

NX ("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 SETNX va SETEX buyruqlarini uchratasiz. Ular SET … NX va SET … EX ning eski shakli. Hujjat yangi kodda SET parametrlarini tavsiya qiladi.

3.3 Tuzoq: oddiy SET TTL'ni o'chiradi

text
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
-1

Diqqat 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: DEL

Diagrammaga qarang: "Muddatli" holatdan "Abadiy"ga o'tishning ikki yo'li bor. PERSIST — ataylab, oddiy SET — ko'pincha bexosdan.

3.4 EXPIRE va uning variantlari

text
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
300

EXPIRE 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, keyin SET a 2, keyin TTL 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

text
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 — 0 dan boshlaydi va 1 qaytaradi. Oldindan SET 0 shart 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:

js
const soni = await redis.incr(`vz:korishlar:vazifa:${id}`);
// soni — son (number), satr emas

5. 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:

text
vz:foydalanuvchi:1:ism
vz:sessiya:abc123
vz:korishlar:vazifa:7
vz:tashrif:2026-10-25

ilova: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:1 va vz:1:foydalanuvchi aralashsa, keyin SCAN naqshi ishlamaydi.
  • Qisqa, lekin tushunarli. Har kalit nomi xotirada saqlanadi. Millionlab kalitda vz:f:1 va vazifalar_ilovasi:foydalanuvchi:1 farqi megabaytlarga yetadi. Lekin x:1:a kabi 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 (masalan sha1) 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:

text
127.0.0.1:6379> DBSIZE
200004

Keyin KEYS vz:sinov:* ni berib, Redis'ning sekin buyruqlar jurnali (SLOWLOG) dan server ichidagi vaqtni oldi. Chiqishdan tegishli qatorlar:

text
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:

text
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:

  1. Birinchi chaqiruv — kursor 0.
  2. Keyingi chaqiruvga qaytgan kursorni bering.
  3. Kursor yana 0 qaytsa — aylanib bo'ldi.
  4. Bo'sh bo'lak — to'xtash sababi emas. Faqat kursor 0 bo'lsa to'xtang.
  5. 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:

js
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 SCAN siklini 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 SET parametri —
  • Qiymatni yangilab, muddatni saqlaydigan parametr —
  • Productionda KEYS o'rniga ishlatiladigan buyruq —
Yechim
  • -1 — abadiy kalit; oddiy SET dan 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
js
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:

text
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 } = {}) — nx bo'lsa va kalit bor bo'lsa null, aks holda "OK"; ex — soniya; keepttl — eski muddatni saqlaydi; ikkalasi ham bo'lmasa — muddat o'chadi;
  • get(kalit) — muddati o'tgan bo'lsa null (va kalitni o'chiradi);
  • ttl(kalit) — kanondagi uch xil javob (qolgan soniyani Math.ceil bilan).

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
js
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:

text
OK 60
null 1
OK 57
OK -1 -2

Natija 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 — KEYS o'chirilgan; kalitlar prefiks bilan; har muddatli ma'lumotda TTL majburiy.
  • Intervyuda: "TTL -1 va -2 farqi?", "Nega KEYS xavfli?", "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; oddiy SET muddatni o'chiradi.
  • TTL: son — qolgan soniya, -1 — abadiy, -2 — yo'q.
  • INCR — atomik hisoblagich, yo'q kalitda 0 dan boshlaydi.
  • Kalitlar: ilova:obyekt:id:maydon; KEYS bitta oqimni bloklaydi (42.9 ms / 200 000 kalit) — SCAN kursor 0 gacha.

Keyingi dars: Hash, List, Set va Sorted Set — vazifani maydonlari bilan saqlash, faollik lentasi, noyob tashrifchilar va reyting jadvali.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Redis String va TTL: SET EX NX, INCR va kalit nomlash qoidalari — IlmHamroh