تخطَّ إلى المحتوى
SDSystem Design
وظفني
كل المراحل
Phase 03 / 05

Scalability & Performance

القلب اللي بيفرّق بين developer و senior engineer. ازاي تخلي السيستم أسرع و يستحمل millions.

0%
Section 01

Caching

ازاي تخلي السيستم أسرع 100 مرة

السيناريو

عندك تطبيق فيه صفحة "Trending Products". الصفحة دي بتظهر لكل يوزر يدخل الموقع. كل مرة، الـ database بتعمل query معقدة بتحسب الترتيب من ملايين الـ products.

المشكلة: لو 100 ألف يوزر دخلوا الصفحة في دقيقة، الـ database هتعمل نفس الـ query 100 ألف مرة. السيرفر هيقع.

الحل؟ نحسب النتيجة مرة واحدة، نخزنها، و نخدم الكل من النسخة المخزنة.

ايه هو الـ Cache؟

الـ Cache هو layer وسيط بين التطبيق و الـ database. بيخزن البيانات اللي بتتطلب كتير في memory سريعة جداً (RAM).

الفرق في الأداء
قراءة من Database (SSD)~10 ms
قراءة من Cache (Redis)~0.1 ms

الـ Cache أسرع 100 مرة من الـ Database

Cache Hit vs Cache Miss

لما التطبيق يطلب بيانات، فيه احتمالين:

Cache Hit

البيانات موجودة في الـ cache. ترجع فوراً. الـ database مش بيتشاف.

Cache Miss

البيانات مش موجودة. لازم نروح للـ database، نجيبها، و نحطها في الـ cache للمرة الجاية.

الهدف: Cache Hit Rate عالي. لو 95% من الـ requests بتلاقي البيانات في الـ cache، السيرفر مرتاح جداً.

استراتيجيات الـ Caching

فيه طرق مختلفة للـ caching، كل واحدة ليها use case:

1. Cache-Aside (Lazy Loading)

التطبيق بيدور في الـ cache أولاً. لو ملقاش، يجيب من الـ database و يحط في الـ cache.

الأشهر و الأبسط. مناسب لمعظم الحالات.

2. Write-Through

أي write بيحصل، التطبيق بيكتب في الـ cache و الـ database في نفس الوقت.

consistency أفضل، بس writes أبطأ.

3. Write-Behind (Write-Back)

Writes تروح للـ cache فوراً، و الـ cache يكتب في الـ database لاحقاً.

writes أسرع، بس فيه risk لو الـ cache وقع.

4. Refresh-Ahead

الـ cache بيحدّث نفسه قبل ما البيانات تـ expire، عشان دايماً تكون fresh.

مناسب للبيانات اللي بتتطلب باستمرار.

Cache Invalidation: أصعب جزء

فيه مقولة شهيرة في الـ computer science:

"There are only two hard things in Computer Science: cache invalidation and naming things."

- Phil Karlton

المشكلة: لو الـ data في الـ database اتغيرت، لازم الـ cache يعرف. لو ما عرفش، اليوزر هيشوف بيانات قديمة.

مثال

المنتج سعره 100 جنيه، و في الـ cache. غيرت السعر لـ 150 في الـ database. لكن الـ cache لسه فيه 100. اليوزر يدخل، يشوف 100، يشتري. خسرت فلوس.

الحلول:

  • TTL (Time to Live): كل entry في الـ cache تـ expire بعد فترة (مثلاً 5 دقايق)
  • Manual Invalidation: لما تعدل البيانات، تمسح الـ cache
  • Write-Through: الـ cache بيتحدث مع كل write

مستويات الـ Caching

الـ caching بيحصل في كذا مستوى مختلف:

1. Browser Cache

المتصفح بيحفظ صور و CSS و JS. بيقلل الـ requests للسيرفر.

2. CDN Cache

السيرفرات الـ edge بتخزن المحتوى الثابت. (اتكلمنا عنها في المرحلة 1)

3. Application Cache (Redis/Memcached)

الأشهر. بنخزن نتائج queries، sessions، rate limits.

4. Database Cache

الـ database نفسها فيها cache داخلي للـ queries المتكررة.

Redis vs Memcached: Redis أكثر شعبية لإنه بيدعم data structures (lists, sets, hashes). Memcached أبسط و أسرع شوية للـ key-value فقط.

أسئلة انترفيو على القسم ده

3
القسم 1 / 5