التكنولوجيا والبنية التحتية → Redis: حلول في الذاكرة
Redis: حلول في الذاكرة
1) حيث يكون Redis مناسبًا
Redis عبارة عن تخزين عالي السرعة لقيمة المفتاح في الذاكرة مع هياكل بيانات غنية. السيناريوهات النموذجية:- Cache (قراءة/جانبًا، TTL، SWR) والجلسات.
- العدادات والحصص: الحد من الأسعار، ومكافحة الاحتيال، وحدود الحملة.
- لوحات الصدارة/التصنيفات (ZSet)، توصيات «أعلى N».
- طوابير/حافلات الأحداث (Streams/PubSub)، outbox/inbox، retrays.
- Idempotence (مفاتيح مع TTL)، شبكات de-dup.
- Geo (البحث عن أقرب النقاط)، Bitmap (الأعلام، DAU).
- الأسماء المستعارة/الرموز ومخابئ الترخيص قصيرة الأجل.
2) هياكل البيانات ومتى يتم تطبيقها
السلسلة: القيم/العدادات (INCRBY)، المفاتيح الخفية.
هاش: مجاميع الملفات الشخصية/التكوينات، تخزين الكائنات «خفيفة الوزن».
القائمة: قوائم انتظار بسيطة (ولكن بدون إعادة/تعويض الدلالات).
المجموعة: عناصر فريدة، تفريغ.
ZSet: الفرز حسب السرعة (لوحات المتصدرين، تقويم TTL - الأحداث «المؤجلة»).
البث: قوائم انتظار مستقرة مع مجموعات المستهلكين، «XREADGROUP »/إعادة التشغيل - لخطابات الويب، CDC، إعادة التصوير.
GEO: «GEOADD/GEORADIUS» - أقرب النقاط/التجار.
Bitmap/Bitfield: سلسلة من الأعلام (تسجيل الدخول في اليوم، DAU/WAU).
HyperLogLog: تقريبي فريد (UU) رخيص في الذاكرة.
Bloom/Cuckoo (وحدات): فحوصات التوافر السريع، قلل من «MISS» إلى المصدر.
- RedisJSON (وثائق JSON)، RediSearch (الفهرسة/البحث)، RedisBloom (الهياكل الاحتمالية)، TimeSeries (المقاييس/التجميعات).
3) سياسات المفاتيح و TTL والذاكرة
التسمية والتجزئة:
tenant:{t}:domain:{d}:{entity}:{id}:v{schema} region={R} currency={C} lang={L}
الإصدار (vN)، يتضمن فقط أبعادًا ذات مغزى (المنطقة/العملة/اللغة/المستأجر).
عزل المساحات الرئيسية لكل مستأجر.
- استخدم مصفوفة TTL (sec/min/hr)، أضف jitter (± 10-20٪) لتجنب التدافع.
- للمفاتيح الساخنة - التحديث للأمام ورحلة واحدة (تحديثات قائد واحد).
- «allkeys-lru/lfu» هو مخبأ مشترك بدون اعتماد TTL.
- «volatile-lru/lfu» - مفاتيح فقط مع TTL.
- «الإخلاء» - اكتب الفشل عند الفائض (أكثر أمانًا لقوائم الانتظار/العدادات الحاسمة).
- اختر النص وراقب دائمًا «مفاتيح الإخلاء».
4) المعاملات وخطوط الأنابيب والنصوص
خطوط الأنابيب: تقليل RTT، فرق 10-100 المجموعة.
المعاملات (MULTI/EXEC) - لا تعزل القراءات، بل تنفذ الدفعة ذريًا.
القفل الأمثل: «WATCH key» → MULTI/EXEC → check.
Lua scripts: atomic logic on the server side (rate limite, locks, composite operations).
5) قوائم الانتظار والحافلات: القائمة مقابل التيار
قائمة + «BRPOP» - بسيطة، ولكن لا توجد مجموعات مستهلكين، تعويض/إعادة تشغيل، مقاومة ضعيفة للانخفاضات.
البث: «XADD → XREADGROUP → XACK»، إعادة المحاولة المميتة (لم يتم أخذها في دقائق N)، التقسيم حسب المفتاح. موصى به لخطابات الويب الخاصة بشعبة الخدمات العامة/شركة KYC، والمدفوعات/الإخطارات المؤجلة.
قوائم الانتظار ذات الأولوية: عدة تدفقات حسب الأولوية، المستهلكون «يمتصون» من الأعلى في المقام الأول.
المهام المؤجلة: ZSet حيث النتيجة = الطابع الزمني ؛ تم نقل «ZRANGEBYSCORE» الدوري ≤ → الآن إلى Stream.
6) ارتفاع التوافر وقابلية التوسع
النسخ المتماثلة: master→replica (مقياس القراءة).
الحارس: فشل تلقائي سيد، اكتشاف، عميل URIs.
Redis Cluster: 16384 فتحة شق، نطاق أفقي. لف المفاتيح التي تستخدم هياكل متعددة في علامات التجزئة '{ترتيب: 123}.
- بالنسبة للذاكرة المخبأة/الجلسات - المجموعة/النسخة المقلدة، تم دعم SDK «التجزئة من جانب العميل».
- بالنسبة للطوابير/التيارات - تقليل العمليات عبر الفتحات إلى أدنى حد ؛ التقسيم حسب مفاتيح المجال.
7) المثابرة: RDB و AOF والنسخ الاحتياطية
RDB (لقطات): أسرع وأكثر اقتصادا ؛ خطر فقدان الثواني/الدقائق الأخيرة.
AOF (يومية): خسائر أقل ؛ أوضاع «everysec/دائمًا». ضغط AOF وإعادة التعبئة الدورية.
الهجين: RDB + AOF → التعافي السريع + الخسائر المعتدلة.
النسخ الاحتياطية: لقطات ونسخ من AOF لتخزين الأشياء ؛ تحقق من الشفاء بانتظام.
لقوائم الانتظار الحرجة/الخصوصية، حدد تكرار AOF 'everysec' +.
8) السلامة والامتثال
AUTH/ACL: الأدوار لكل تطبيق، وحظر الأوامر «الخطرة» ('FLUSHALL،' KEYS').
TLS to client-server and inter-node links; Ext-IP ثابت.
تقسيم الشبكة: شبكات فرعية خاصة، SG/NACL ؛ الوصول فقط من الخدمات/مساحات الأسماء المطلوبة.
لا تسجل الأسرار ؛ PAN/PII في Redis - الرموز/المشتقات فقط.
الأوامر الرئيسية: تجنب "KEYS' - استخدم" SCAN ".
9) إمكانية الرصد و SLO
المقاييس الرئيسية:- Latency (P95/P99), "instaneous _ ops _ per _ sec", "connected _ clients'.
- ضرب النسبة، evicted_keys، expired_keys.
- الذاكرة: نسبة التجزئة المستعملة، RSS، إحصائيات المخصص.
- تأخر التكرار، ترددات وأحجام AOF/RDB، وقت الشوكة.
- التدفقات: PEL (قائمة الإدخالات المعلقة)، وقت التسليم، عدد إعادة العرض.
- عمليات Redis P99 ≤ 5-10 ms.
- عمليات الإخلاء ≤ 1 ٪/ساعة (مساحة مخبأة).
- دفق التسليم P99 ≤ 500 мс، معدل إعادة التجربة <2٪.
10) FinOps وتخطيط الموارد
الذاكرة باهظة الثمن: قياس ذاكرة الوصول العشوائي (RAM) للشهر/GB مقابل توفير طلبات المنشأ/DB.
تمكين ضغط القيمة> 1-2 كيلوبايت (انظر وحدة المعالجة المركزية).
يمكن أن تعطي LFU ضربة أفضل بحجم أقل.
للصور/النقط الكبيرة - وليس Redis: استخدم تخزين الكائن CDN +.
11) أنماط iGaming/fintech
11. 1 الحد من المعدل (لوا)
الفكرة: «INCRBY» في مفتاح النافذة + TTL ؛ يتحقق لوا ذريًا من الحد ويزيد.
lua
-- KEYS[1]=key ARGV[1]=limit ARGV[2]=ttlSec ARGV[3]=inc local cur = redis. call('INCRBY', KEYS[1], ARGV[3])
if cur == tonumber(ARGV[3]) then redis. call('EXPIRE', KEYS[1], ARGV[2]) end if cur > tonumber(ARGV[1]) then return {0, cur} else return {1, cur} end
11. 2 طلب التطهير
المفتاح 'idemp: {request _ id}' مع TTL 24h، القيمة - النتيجة/الحالة. قبل إجراء العملية، نتحقق من وجودنا.
11. 3 لوحات الصدارة
'ZINCRBY leaderboard: game: {g} score user: {u}' → 'ZREVRANGE... WITHSCORES '.
بالنسبة لأعلى N حسب المنطقة/المستأجر - ZSet أو البادئات الفردية.
11. 4 PSP Webhooks قائمة انتظار
XADD psp: خطابات الويب... «مجموعة المستهلكين →» XGROUP CREATE psp: webhooks g1 $.
إعادة طباعة الرسائل «العالقة» عبر مسح PEL («XPENDING» → «XCLAIM»).
11. 5 المدفوعات المؤجلة
ZSet' الدفع: المستحق "(النتيجة = الحقبة) → يقوم العامل بشكل دوري بنقل العناصر النهائية إلى Stream' الدفع: exec' مع التفريغ.
11. 6 أمتار مضادة للرود
مزيج من 'PFADD' (فريد) + 'INCR' (كثافة) + علامات geo/ASN ؛ المحفزات للتحقق اليدوي.
12) العمل مع الذاكرة والأداء
مجمعات توصيل العملاء ؛ الحد من RTT (البقاء على قيد الحياة).
أفضل خطوط الأنابيب على مجموعة من الأوامر.
شاهد المفاتيح الكبيرة («MEMORY USAGE» و «SCAN») - من الأفضل تقسيم الأشياء.
يعد التجزئة مع عدد قليل من المجالات أكثر اقتصادا من العديد من المفاتيح الفردية.
مكّن io-thread (قراءة ثقيلة) إذا تم تأكيد الربح من خلال الاختبارات.
تجنب "FLUSHDB/ALl' المتكرر في الحاجز ؛ الإدارة عن طريق البادئات و «UNLINK» من أجل الحذف الآمن.
13) تعدد المستأجرين والعزلة
المجموعات/الحالات الفردية أو DB المنطقي لكل مستأجر (إذا كان الحمل صغيرًا).
حصص المفتاح/الذاكرة، تقسيم الرباط الصليبي الأمامي.
البادئات في المفاتيح والمقاييس حسب مساحة الاسم.
14) القفل والاتساق
SET key val NX PX = tl - بسيط mutex.
Redlock: استخدم بعناية ؛ بالنسبة للمعاملات الحرجة الموزعة، من الأفضل الاعتماد على «مصدر الحقيقة» (DB/دفتر الأستاذ) والعمليات الخفية.
تفضل العمليات الذرية و Lua بدلاً من الأقفال «الطويلة».
15) الأنماط المضادة
تخزين النقط/الصور الكبيرة - زيادة في ذاكرة الوصول العشوائي والشبكات.
الثوابت المالية (الميزانية العمومية) فقط في Redis.
«مفاتيح» و «مسح العالم» في الحافز.
لا TTL/jitter - dogpile عند انتهاء الصلاحية.
سياسة «الحساسيات» بشأن قوائم الانتظار الحاسمة → فقدان البيانات عند الضغوط.
مزج قوائم الانتظار والذاكرة المخبأة والجلسات في حالة واحدة بدون حصص وأولويات.
نصوص لوا التي تعمل على مفاتيح فتحات مختلفة في المجموعة.
16) قائمة التنفيذ المرجعية
1. تحديد الأدوار: المخبأ/الجلسات، قوائم الانتظار/التدفقات، العدادات/الحدود - الوظيفة إلى الحالات/المجموعات.
2. اختيار سياسة الحد الأقصى للمهمة ؛ ووضع حدود ورصد عمليات الإخلاء.
3. تسمية المفتاح، إصدارات الدائرة، مصفوفة TTL + jitter ؛ رحلة واحدة للمفاتيح العليا.
4. لقوائم الانتظار - التدفقات (المجموعات، إعادة التدوير، DLQ)، للتأجيل - نقل ZSet +.
5. HA: النسخ المتماثل + Sentinel أو Redis Cluster ؛ تحقق من فشل العميل.
6. المثابرة: RDB/AOF تحت السيناريو ؛ النسخ الاحتياطية العادية واختبار الاسترداد.
7. الأمن: ACL، TLS، الشبكات الخاصة، حظر الأوامر الخطرة.
8. إمكانية الملاحظة: الكمون، العمليات/الثانية، الذاكرة، عمليات الإخلاء، تأخر التكرار، تدفق PEL.
9. FinOps: ملفات تعريف الذاكرة، المفاتيح الكبيرة، الضغط، LFU ؛ تجنب Redis للنقاط الكبيرة.
10. توثيق الأنماط (حد المعدل، الخصوصية، لوحات الصدارة) واختبارات التحميل.
النتيجة
Redis هي «سكين سويسري متعدد الوظائف» من السرعة: مخبأ، قوائم انتظار، عدادات، لوحات قيادة، هياكل جغرافية واحتمالية. تكمن قوتها في الاختيار الصحيح لهياكل البيانات، وانضباط TTL/الإعاقة، وذرية العمليات، و HA المدروس جيدًا/المثابرة والملاحظة. استخدم Redis حيث تعتبر أجزاء من الثانية و RPS عالية مهمة، مع ترك الثوابت الحرجة (المال والمحاسبة) لـ «مصدر الحقيقة» - بهذه الطريقة ستظل المنصة سريعة وموثوقة.