Mundarija (25)
- Bu darsda
- 1. Nega bu kerak?
- 2. Bitmap — har kunga bitta bit
- 2.1 SETBIT va BITCOUNT
- 2.2 Ikki xil sxema
- 3. HyperLogLog — noyoblarni taxminan sanash
- 3.1 PFADD va PFCOUNT
- 3.2 Kanon o'lchovi: 100 000 noyob
- 3.3 Qachon HLL, qachon Set
- 4. Geo — masofa va radius
- 5. Redis 8 modullari: JSON, Bloom, vektorlar
- 5.1 JSON
- 5.2 Bloom filtr
- 5.3 Vector set
- 5.4 Streams — birinchi qarash
- 5.5 Qaysi tuzilmani tanlash
- 6. Ko'p uchraydigan xatolar
- 7. Mashqlar
- 1-mashq (oson): qaysi tuzilma?
- 2-mashq (o'rta): o'z Bitmap'ingiz
- 3-mashq (qiyin): masofani o'zingiz hisoblang
- 8. Loyiha qadami: kanon tajribasi, loyihaga hali kirmaydi
- 9. Real ishda
- Xulosa
- Manbalar
Redis maxsus tuzilmalari: Bitmap, HyperLogLog, Geo, JSON, Bloom va vektorlar
Qisqacha: Redis'da kam ma'lum, lekin kuchli tuzilmalar bor. Bitmap — har foydalanuvchiga bitta bit: oy davomidagi faollik bir necha baytda. HyperLogLog — noyob elementlar sonini taxminan sanaydi: kanonda 100 000 noyob uchun 100 425 (xato +0.43 %), xotira 14 369 bayt — Set'da 3 961 846 bayt edi. Geo — masofa va radius bo'yicha qidiruv (Chorsu–Amir Temur 4.14 km). Redis 8 ichida yana JSON, Bloom filtr ("bu email bormi?" — xotirasiz ehtimoliy javob) va vector set (o'xshashlik qidiruvi) bor. Valkey'da oxirgi uchtasi yo'q.
Bu darsda
- Bitmap bilan kunlik va oylik faollikni belgilaysiz va sanaysiz.
- HyperLogLog'ning aniqlik va xotira narxini o'lchov bilan tushuntirasiz.
- Geo buyruqlari bilan masofa va radius qidiruvini bajarasiz.
- JSON, Bloom filtr va vector set qachon kerakligini bilasiz.
- Streams'ning birinchi
XADDini ko'rasiz.
Oldin bilishingiz kerak: Hash, List, Set va Sorted Set, Bitwise operatorlar va bit bayroqlar.
Oldingi darsda to'rtta asosiy tuzilmani ko'rdik. Set noyob tashrifchilarni aniq sanadi, lekin har elementni saqlagani uchun qimmat edi. Bugun "aniqlikning bir oz qismini berib, xotirani yuz baravar tejash" g'oyasini ko'ramiz.
1. Nega bu kerak?
vazifalar ilovasida 100 000 foydalanuvchi bor. Mahsulot jamoasi so'raydi: "Shu oyda har kuni nechta noyob odam kirdi?" Set bilan: har kuni bitta Set, har biri ~3.8 MB (kanon o'lchovi, 100 000 element). 30 kun — 114 MB. Bitta oddiy hisobot uchun.
Lekin jamoaga kim kirgani emas, faqat nechta kirgani kerak. Bu boshqa savol — va unga ancha arzon javob bor.
O'xshatish: to'yga kelgan mehmonlarni ikki usulda sanash mumkin. Birinchisi — har kelganning ismini daftarga yozish (Set). Ikkinchisi — kirish eshigida turnikning hisoblagichi (HyperLogLog): kimligini bilmaydi, lekin soni taxminan to'g'ri va hech qancha joy egallamaydi.
Hamma chiqishlar — kanon redis-cli tajribasidan (Redis 8.10.2).
2. Bitmap — har kunga bitta bit
2.1 SETBIT va BITCOUNT
Bitmap — alohida tur emas, bitlar sifatida ishlatiladigan oddiy satr. Har bitning raqami (offset) bor, qiymati 0 yoki 1.
Vazifa: Aziz oktyabrning qaysi kunlari ilovaga kirganini belgilash. Bit raqami = oy kuni − 1.
127.0.0.1:6379> SETBIT vz:faol:2026-10 0 1
0
127.0.0.1:6379> SETBIT vz:faol:2026-10 24 1
0
127.0.0.1:6379> BITCOUNT vz:faol:2026-10
2
127.0.0.1:6379> GETBIT vz:faol:2026-10 1
0
127.0.0.1:6379> STRLEN vz:faol:2026-10
4SETBIT kalit 0 1— 1-oktyabr (bit 0) "kirdi". Qaytgan0— bitning eski qiymati.SETBIT … 24 1— 25-oktyabr.BITCOUNT— nechta bit 1: oyda 2 kun faol.GETBIT … 1— 2-oktyabrda kirmagan.STRLEN— 4 bayt. 24-bitga yozish uchun Redis satrni 25 bitgacha — ya'ni 4 baytgacha kengaytirdi. Butun oy (31 kun) ham 4 baytga sig'adi.
Bitlar haqida Bitwise operatorlar va bit bayroqlar darsida o'qigansiz: bayt — 8 bit.
2.2 Ikki xil sxema
Bitmap'ni ikki xil yo'l bilan qurish mumkin:
- Kalit = foydalanuvchi, bit = kun (yuqoridagi misol). Bitta foydalanuvchining oylik faolligi 4 baytda. "Aziz oyda necha kun kirdi?" —
BITCOUNT. - Kalit = kun, bit = foydalanuvchi id.
SETBIT vz:faol:2026-10-25 <id> 1. 1 000 000 foydalanuvchi uchun bitta kun — 125 000 bayt (≈ 122 KB). "Bugun nechta odam kirdi?" —BITCOUNT. Ikki kunda ham kirganlar —BITOP AND.
Ikkinchi sxemaning sharti — id'lar zich son bo'lishi. vazifalar dagi foydalanuvchilar.id — 1, 2, 3… — mos. UUID yoki 10 xonali tasodifiy id'da ulkan, deyarli bo'sh satr hosil bo'ladi (bit 4 000 000 000 — 500 MB).
3. HyperLogLog — noyoblarni taxminan sanash
3.1 PFADD va PFCOUNT
HyperLogLog (HLL) — noyob elementlar sonini taxminan hisoblaydigan ehtimoliy (probabilistic) tuzilma. U elementlarni o'zi saqlamaydi — faqat ularning hash'laridan olingan statistikani.
127.0.0.1:6379> PFADD vz:noyob:sahifa u1 u2 u3 u1
1PF — algoritm muallifi Philippe Flajolet sharafiga. PFADD qaytargan 1 — "ichki holat o'zgardi" (son emas!). u1 ning ikkinchi marta kelishi hisobga olinmaydi.
3.2 Kanon o'lchovi: 100 000 noyob
Kanon bir xil 100 000 foydalanuvchini (u1…u100000) ham HLL'ga, ham Set'ga qo'shdi. Chiqishda ikki narsaga qarang: sanoq (PFCOUNT va SCARD) va xotira (MEMORY USAGE):
127.0.0.1:6379> PFCOUNT vz:noyob:katta
100425
127.0.0.1:6379> SCARD vz:noyob:set
100000
127.0.0.1:6379> MEMORY USAGE vz:noyob:katta
14369
127.0.0.1:6379> MEMORY USAGE vz:noyob:set
3961846- HLL: 100 425 — haqiqiydan 425 ta ko'p, xato +0.43 %. Redis hujjati bo'yicha HLL'ning standart xatosi 0.81 % — o'lchov shu chegara ichida.
- Set: aniq 100 000.
- Xotira (
MEMORY USAGE— kalit egallagan baytlar): HLL 14 369 bayt (≈ 14 KB), Set 3 961 846 bayt (≈ 3.8 MB) — 275 baravar ko'p.
- HyperLogLogPFCOUNT 100 425 (+0.43 %)14 KB
- SetSCARD 100 000 (aniq)3 869 KB
Manba: IlmHamroh kanon o'lchovi, 2026-10-25: Redis 8.10.2, MEMORY USAGE (14 369 va 3 961 846 bayt)
Grafikka qarang: HLL ustuni deyarli ko'rinmaydi. Muhimi — HLL hajmi elementlar soniga deyarli bog'liq emas: 100 000 yoki 100 million — ~12–14 KB atrofida (hujjat: eng ko'pi 12 KB ma'lumot qismi). Set esa chiziqli o'sadi.
3.3 Qachon HLL, qachon Set
| Savol | Tuzilma |
|---|---|
| "Bugun nechta noyob odam?" (hisobot, grafik) | HLL |
| "Aziz bugun kirganmi?" | Set yoki Bitmap |
| "Bugun kirganlar ro'yxati" | Set |
| Pul, bonus, limit — aniq son shart | Set yoki Postgres |
HLL'larni birlashtirish mumkin: PFMERGE vz:noyob:hafta vz:noyob:2026-10-19 … vz:noyob:2026-10-25 — haftalik noyoblar, kunlik hisoblardan. Set'da buning narxi har kunning to'liq ro'yxati.
Tekshirib ko'ring: Marketing bo'limi "bonus faqat 10 000-noyob foydalanuvchiga beriladi" degan aksiya qilmoqchi. Kirganlarni HLL bilan sanab, 10 000 ga yetganda to'xtatsa bo'ladimi?
Javob
Yo'q. HLL taxminiy: kanonda xato +0.43 % edi, hujjat bo'yicha odatiy xato 0.81 %. 10 000 da bu ±80 kishi atrofida — kimdir bonusni ololmay qoladi yoki ortiqcha beriladi. Bundan tashqari HLL kim ekanini bilmaydi — bonusni kimga berishni ham ayta olmaydi. Pul bilan bog'liq hisob — aniq tuzilma (Set yoki Postgres'dagi UNIQUE cheklov).
4. Geo — masofa va radius
Geo — xaritadagi nuqtalarni (uzunlik va kenglik bilan) saqlab, ular orasidagi masofani va radius ichidagilarni topadigan buyruqlar. Quyida uchta buyruq: joylarni qo'shish, ikki joy orasidagi masofa va nuqta atrofida qidiruv.
127.0.0.1:6379> GEOADD vz:joylar 69.2346 41.3266 chorsu 69.2797 41.3111 amir-temur 66.9750 39.6547 registon
3
127.0.0.1:6379> GEODIST vz:joylar chorsu amir-temur km
4.1435
127.0.0.1:6379> GEOSEARCH vz:joylar FROMLONLAT 69.2400 41.3200 BYRADIUS 5 km ASC WITHDIST
chorsu
0.8616
amir-temur
3.4613GEOADD kalit uzunlik kenglik nom— avval uzunlik (longitude), keyin kenglik (latitude). PostGIS'dagiPOINT(lon lat)bilan bir xil tartib (PostGIS va geo so'rovlar). Teskari bersangiz — nuqta boshqa qit'ada.GEODIST— Chorsu bozori va Amir Temur xiyoboni orasi 4.1435 km. PostGIS darsida kanonST_Distancebilan 4 150 m olgan edi. Farqi 7 m: Redis Yerni shar deb hisoblaydi, PostGIS esa aniqroq ellipsoid modelini ishlatadi.GEOSEARCH … FROMLONLAT … BYRADIUS 5 km ASC WITHDIST— berilgan nuqtadan 5 km ichidagi joylar, yaqindan uzoqqa, masofasi bilan. Samarqanddagi Registon (≈ 266 km) natijaga kirmadi.
Ichkarida Geo — oddiy Sorted Set: ball sifatida koordinatadan hisoblangan geohash (52 bitli son) saqlanadi. Shuning uchun ZRANGE vz:joylar 0 -1 ham ishlaydi, ZREM bilan joy o'chiriladi.
"Eng yaqin 5 ta taksi" kabi tez-tez o'zgaradigan nuqtalar uchun Redis Geo qulay: taksi har 5 soniyada joyini yangilaydi (GEOADD), mijoz uchun GEOSEARCH … COUNT 5. Murakkab geometriya (poligon, yo'l bo'ylab masofa) — PostGIS ishi.
5. Redis 8 modullari: JSON, Bloom, vektorlar
Redis 8 bilan birga keladigan modullar (Redis nima va ulanish darsida MODULE LIST da ko'rgan edik). Valkey'da bular yo'q — kanon sinadi: ERR unknown command 'JSON.SET'.
5.1 JSON
127.0.0.1:6379> JSON.SET vz:sozlama:1 $ {"til":"uz-Latn","mavzu":"qorongi","bildirishnoma":{"email":true}}
OK
127.0.0.1:6379> JSON.GET vz:sozlama:1 $.bildirishnoma.email
[true]
127.0.0.1:6379> JSON.SET vz:sozlama:1 $.mavzu "yorug"
OK
127.0.0.1:6379> JSON.GET vz:sozlama:1
{"til":"uz-Latn","mavzu":"yorug","bildirishnoma":{"email":true}}RedisJSON — ichma-ich JSON hujjatni saqlab, uning bir qismini o'qish va o'zgartirish. $ — ildiz, $.bildirishnoma.email — yo'l (JSONPath). JSON.GET yo'l bilan massiv qaytaradi ([true]): JSONPath bir nechta mos joyni topishi mumkin.
Hash bir darajali edi; JSON — istalgan chuqurlikda. Oddiy String'da JSON saqlashdan farqi: $.mavzu ni o'zgartirish uchun butun obyektni o'qib-yozish kerak emas, amal atomik. Shu sozlamalar Postgres'da JSONB ustunda turadi (JSONB) — Redis'dagisi faqat tez o'qiladigan nusxa bo'lishi kerak.
5.2 Bloom filtr
127.0.0.1:6379> BF.ADD vz:email:bloom aziz@example.com
1
127.0.0.1:6379> BF.EXISTS vz:email:bloom aziz@example.com
1
127.0.0.1:6379> BF.EXISTS vz:email:bloom yoq@example.com
0Bloom filtr — "bu element to'plamda bormi?" savoliga juda kam xotira bilan javob beradigan ehtimoliy tuzilma. Javoblar assimetrik:
0— aniq yo'q. Hech qachon xato emas.1— ehtimol bor. Kichik ehtimol bilan "soxta ijobiy" (false positive) bo'lishi mumkin. Xato ulushini filtr yaratishda tanlaysiz (BF.RESERVE).
Ishlatilishi: "bu email ro'yxatdan o'tganmi?" degan millionlab tekshiruvni bazaga yubormaslik. 0 bo'lsa — darhol "bo'sh", Postgres'ga bormaymiz. 1 bo'lsa — Postgres'da aniq tekshiramiz. Bazaga yuk keskin kamayadi. Bloom'dan element o'chirib bo'lmaydi (buning uchun Cuckoo filtr — CF.*).
Tekshirib ko'ring: Ro'yxatdan o'tish formasida Bloom
BF.EXISTS1qaytardi. "Bu username band" deb darhol rad etsa bo'ladimi?
Javob
Yo'q. 1 — faqat "ehtimol bor": kichik ehtimol bilan soxta ijobiy bo'lishi mumkin. Unda bo'sh username'ni ham "band" deb rad etgan bo'lardik. 1 dan keyin Postgres'da aniq tekshiramiz. 0 esa aniq javob — bazaga bormasdan "bo'sh" deyish mumkin.
5.3 Vector set
127.0.0.1:6379> VADD vz:vektor VALUES 3 0.1 0.2 0.3 vazifa:1
1
127.0.0.1:6379> VADD vz:vektor VALUES 3 0.9 0.1 0.0 vazifa:2
1
127.0.0.1:6379> VSIM vz:vektor VALUES 3 0.1 0.25 0.3 WITHSCORES COUNT 2
vazifa:1
0.9976398050785065
vazifa:2
0.6563326716423035Vektor — sonlar ro'yxati, ma'noni ifodalovchi "koordinata". AI modellari matnni yuzlab sonli vektorga aylantiradi (embedding): ma'nosi yaqin matnlarning vektorlari ham yaqin. Vector set (Redis 8 da yangi tur) — vektorlarni saqlab, berilgan vektorga eng o'xshashlarini topadi.
Kanon 3 o'lchamli o'yinchoq vektorlar bilan sinadi. So'ralgan [0.1, 0.25, 0.3] ga vazifa:1 juda yaqin (o'xshashlik 0.9976, 1 ga yaqin — deyarli bir xil yo'nalish), vazifa:2 uzoqroq 0.6563-bob. Haqiqiy loyihada vektorlar 384–1536 o'lchamli bo'ladi va AI modelidan olinadi. "Shu vazifaga o'xshash vazifalar" yoki semantik qidiruv shunday quriladi. Postgres'da buning muqobili — pgvector kengaytmasi (Extension'lar). AI va embedding'lar kursning keyingi qismlarida.
5.4 Streams — birinchi qarash
127.0.0.1:6379> XADD vz:hodisalar * amal yaratdi vazifa 7
1792909470796-0
127.0.0.1:6379> XLEN vz:hodisalar
1Stream — qo'shib boriladigan jurnal: har yozuvning vaqtga asoslangan ID'si bor (<millisekund>-<tartib>; * — "ID'ni o'zing ber"). Bu ID har safar boshqacha — vaqtga bog'liq. Pub/Sub'dan farqli, xabarlar saqlanadi va bir nechta ishchi ularni bo'lishib o'qiydi. To'liq — Pub/Sub va Redis Streams darsida.
Redis 8 da yana TimeSeries (vaqt qatorlari) va Search (to'liq matnli qidiruv) modullari bor — bu kursda ularni ishlatmaymiz.
5.5 Qaysi tuzilmani tanlash
Darsdagi hamma tuzilma bitta savoldan boshlanadi: sizga nima kerak — ro'yxatmi, sonmi, "bormi?" javobimi yoki joylashuvmi? Diagramma shu savollar bo'yicha yo'l ko'rsatadi:
flowchart TD
S{Nima kerak?} -->|ha/yo'q, zich id| B[Bitmap]
S -->|noyoblar soni| A{Aniq son shartmi?}
A -->|ha| ST[Set yoki Postgres]
A -->|taxmin yetadi| H[HyperLogLog]
S -->|bormi? tez filtr| BF[Bloom filtr]
S -->|masofa, radius| G[Geo]
S -->|ichma-ich sozlama| J[JSON]
S -->|ma'nosi o'xshash| V[Vector set]Ehtimoliy tuzilmalar (HyperLogLog, Bloom) xotirani keskin tejaydi, lekin aniqlikdan biroz voz kechadi. Pul, bonus va huquq kabi aniq hisob kerak joyda — Set yoki Postgres.
6. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
| Bitmap kalit yuzlab MB | bit raqami — katta yoki tasodifiy id | zich id yoki boshqa tuzilma |
| HLL soni "noto'g'ri" | HLL taxminiy (≈ 0.81 %) | aniq kerak bo'lsa — Set |
PFADD qaytargani 1, lekin son kutilgan |
u "holat o'zgardi" bayrog'i | son — PFCOUNT |
| Geo nuqta boshqa joyda (masalan Arktikada) | kenglik va uzunlik almashgan | avval uzunlik (lon) |
ERR unknown command 'JSON.SET' |
Valkey yoki modulsiz Redis | Redis 8 yoki String'da JSON |
Bloom 1 dedi, lekin element yo'q |
soxta ijobiy — tabiiy xulq | 1 dan keyin bazada aniq tekshiring |
7. Mashqlar
Mashqlar kurs/mashqlar/27/56-maxsus/ da.
1-mashq (oson): qaysi tuzilma?
- 1 million foydalanuvchining bugungi faolligi (ha/yo'q) —
- Saytning oylik noyob tashrifchilari soni (taxminiy yetadi) —
- "Bu username bandmi?" — bazaga yuborishdan oldin tez filtr —
- 2 km ichidagi taksilar —
- Bloom filtrda
0javobi: element
Yechim
- Bitmap — kalit = kun, bit = id; 125 000 bayt.
- HyperLogLog — ~12–14 KB, xato ≈ 0.81 %.
- Bloom —
0bo'lsa Postgres'ga bormaymiz. - Geo —
GEOSEARCH … BYRADIUS 2 km. - aniq yo'q —
1esa faqat "ehtimol bor".
2-mashq (o'rta): o'z Bitmap'ingiz
Uint8Array bilan Bitmap yasang: bitQoy(bitlar, offset) (kerak bo'lsa massivni kengaytirib, yangi massivni qaytaradi), bitOl(bitlar, offset), bitSana(bitlar). Redis'dagidek bit tartibi: 0-bit — birinchi baytning eng chap (eng katta) biti. Kanonni takrorlang: 0 va 24 bitlarni qo'ying, keyin BITCOUNT, GETBIT 1 va bayt uzunligini chiqaring.
Yechim
function bitQoy(bitlar, offset) {
const bayt = Math.floor(offset / 8);
let b = bitlar;
if (bayt >= b.length) {
b = new Uint8Array(bayt + 1);
b.set(bitlar);
}
b[bayt] |= 0b1000_0000 >> offset % 8;
return b;
}
function bitOl(bitlar, offset) {
const bayt = bitlar[Math.floor(offset / 8)] ?? 0;
return (bayt >> (7 - (offset % 8))) & 1;
}
function bitSana(bitlar) {
let n = 0;
for (let x of bitlar) {
while (x) {
n += x & 1;
x >>= 1;
}
}
return n;
}
let oy = new Uint8Array(0);
oy = bitQoy(oy, 0); // 1-oktyabr
oy = bitQoy(oy, 24); // 25-oktyabr
console.log(bitSana(oy), bitOl(oy, 1), oy.length);
const ikkilik = (x) => x.toString(2).padStart(8, "0");
console.log([...oy].map(ikkilik).join(" "));Konsolda:
2 0 4
10000000 00000000 00000000 10000000Javoblar kanon bilan bir xil: BITCOUNT 2, GETBIT 1 — 0, STRLEN — 4 bayt. Ikkinchi qatorda bitlarning o'zi: 0-bit — birinchi baytning chap biti, 24-bit — to'rtinchi baytning chap biti. 0b1000_0000 >> n — chap bitdan n qadam o'ngga siljigan niqob (Bitwise operatorlar va bit bayroqlar).
3-mashq (qiyin): masofani o'zingiz hisoblang
Redis GEODIST ni haversine formulasi bilan hisoblaydi (Yer radiusi Redis manba kodida 6 372 797.560856 m). Formula: a = sin²(Δkenglik/2) + cos(kenglik1)·cos(kenglik2)·sin²(Δuzunlik/2), masofa = 2R · asin(√a) (burchaklar radianda). masofa(lon1, lat1, lon2, lat2) funksiyasini yozing va kanon nuqtalari uchun km'da 4 xona aniqlikda hisoblang: Chorsu–Amir Temur, qidiruv nuqtasi (69.2400, 41.3200) dan Chorsu va Amir Temurgacha. Redis javoblari bilan solishtiring.
Yechim
const R = 6372797.560856;
const rad = (d) => (d * Math.PI) / 180;
function masofa(lon1, lat1, lon2, lat2) {
const u = Math.sin(rad(lat2 - lat1) / 2);
const v = Math.sin(rad(lon2 - lon1) / 2);
const a =
u * u + Math.cos(rad(lat1)) * Math.cos(rad(lat2)) * v * v;
return 2 * R * Math.asin(Math.sqrt(a));
}
const km = (m) => (m / 1000).toFixed(4);
const chorsu = [69.2346, 41.3266];
const amir = [69.2797, 41.3111];
const nuqta = [69.24, 41.32];
console.log("chorsu-amir:", km(masofa(...chorsu, ...amir)));
console.log("nuqta-chorsu:", km(masofa(...nuqta, ...chorsu)));
console.log("nuqta-amir:", km(masofa(...nuqta, ...amir)));Konsolda:
chorsu-amir: 4.1432
nuqta-chorsu: 0.8616
nuqta-amir: 3.4611Redis: 4.1435, 0.8616, 3.4613. Kichik farq (0.2–0.3 m) — Redis koordinatani aniq saqlamaydi: GEOADD uni 52 bitli geohash'ga o'giradi, GEODIST esa geohash'dan qayta tiklangan (biroz siljigan) nuqtalar bilan hisoblaydi. Qidiruv nuqtasi esa buyruqda aniq berilgan — shuning uchun 0.8616 mos tushdi. Taksi yoki "yaqin do'konlar" uchun bunday aniqlik yetarli.
8. Loyiha qadami: kanon tajribasi, loyihaga hali kirmaydi
vazifalar-api ga bu darsda kod qo'shilmaydi. Statistika va analitika ilovada hali yo'q, joylar esa vazifalar mavzusiga tegishli emas. O'zingiz sinab ko'ring: redis-cli da o'z mahallangizdagi 3 ta joyni GEOADD qiling va GEOSEARCH bilan uyingizdan 1 km ichidagilarini toping. HLL'ga 1 000 ta tasodifiy id qo'shib, PFCOUNT xatosini hisoblang.
9. Real ishda
- Analitika — HyperLogLog bilan noyob tashrifchilar (Redis'ni ishlatadigan ko'p analitika tizimlari shunday qiladi), Bitmap bilan retention kogortalari.
- Taksi va yetkazib berish — Geo bilan "eng yaqin haydovchi".
- Ro'yxatdan o'tish formasi — Bloom bilan "username band" tez tekshiruvi.
- AI qidiruv — vector set yoki pgvector bilan semantik qidiruv, tavsiyalar.
- Intervyuda: "100 million noyob foydalanuvchini qanday sanaysiz?", "Bloom filtr nima va qanday xato qiladi?"
Xulosa
- Bitmap — bitta bit = bitta ha/yo'q; 31 kun 4 baytda; id zich bo'lishi shart.
- HyperLogLog — noyoblar soni taxminan: kanonda +0.43 %, 14 KB vs Set 3.8 MB; aniq hisob uchun emas.
- Geo —
GEOADD(avval uzunlik),GEODIST,GEOSEARCH; ichida Sorted Set. - Redis 8: JSON (yo'l bilan qisman o'zgartirish), Bloom (
0— aniq yo'q), vector set (o'xshashlik); Valkey'da yo'q. - Stream — saqlanadigan jurnal, ID vaqtga asoslangan.
Keyingi dars: Atomiklik: MULTI, Lua va pipelining — bir nechta buyruqni xavfsiz birga bajarish: tranzaksiya, optimistik qulf, Lua skript va 10 000 buyruqni 30 ms da yuborish.
Manbalar
- Redis hujjati — Bitmap, HyperLogLog (standart xato 0.81 %, 12 KB): https://redis.io/docs/latest/develop/data-types/bitmaps/, https://redis.io/docs/latest/develop/data-types/probabilistic/hyperloglogs/
- Geo: https://redis.io/docs/latest/develop/data-types/geospatial/, GEODIST haversine — Redis manba kodi
src/geohash_helper.c - JSON, Bloom filtr: https://redis.io/docs/latest/develop/data-types/json/, https://redis.io/docs/latest/develop/data-types/probabilistic/bloom-filter/
- Vector sets (Redis 8): https://redis.io/docs/latest/develop/data-types/vector-sets/
- Chiqishlar — kanon o'lchovi (IlmHamroh, 2026-10): Redis 8.10.2,
redis-cli; PostGIS masofasi — PostGIS va geo so'rovlar darsidagi o'lchov.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!