الـ Basket Module في E-Commerce

الفكرة الأساسية:

  • المستخدم يضيف المنتجات إلى الـ Basket (Cart).
  • الـ Basket بتتخزن مؤقتًا بحيث:
    • تستمر لو قفل الموقع وفتحه تاني.
    • تكون البيانات قابلة للوصول من الـ Backend.
    • تكون خفيفة وتتكيف مع البيانات المؤقتة.

طرق تخزين الـ Basket

1. تخزين البيانات في قاعدة بيانات (DB) عادية:

  • الطريقة: تخزين الـ Basket في الـ DB بشكل دائم.
  • المشاكل:
    • مكلف جدًا لأن كل العمليات (حتى المؤقتة) هتتخزن.
    • هيبقى فيه بيانات كتير مزيفة (Fake).
    • أداء أبطأ لأن العمليات بتتطلب قراءة/كتابة من الهارد (Hard Disk).

2. تخزين البيانات في Browser Storage:

  • الطريقة: تخزين الـ Basket على جهاز المستخدم في Local Storage أو Session Storage.
  • المشاكل:
    • مش متاحة للـ Backend: الـ Backend مش هيقدر يستخدمها لتحليل البيانات أو التفاعل معها.
    • غير متزامنة بين الأجهزة: لو المستخدم فتح الموقع من جهاز آخر مش هيلاقي نفس الـ Basket.
    • قيود على نوع البيانات: الـ Value لازم تكون String أو JSON.

3. استخدام Memory Database (In-Memory Data Store):

  • الطريقة: تخزين الـ Basket في ذاكرة الخادم (RAM) باستخدام أدوات مثل Redis.
  • المميزات:
    1. سرعة عالية:
      • البيانات متاحة مباشرة من الـ RAM، مما يحسن الأداء.
    2. Access للـ Backend:
      • الـ Backend بيقدر يوصل لكل البيانات بسهولة.
    3. توفير التكاليف:
      • البيانات المؤقتة مش بتروح للـ Hard Disk.
    4. مرونة في التحكم في عمر البيانات (Expiry):
      • إمكانية حذف البيانات بعد فترة معينة (مثال: أسبوع أو شهر).
    5. حل مشكلة الـ Clustering:
      • تقسيم البيانات على أكتر من خادم لزيادة السرعة وتحمل الضغط.

استخدام Redis في الـ Basket Module

ما هو Redis؟

الـRedis أداة In-Memory Data Store بتدعم:

  1. Key-Value Store:
    • كل عنصر في الـ Redis بيتخزن كـ Key-Value Pair.
  2. Clustering:
    • تقسيم البيانات على أكتر من قاعدة بيانات لتسريع عمليات القراءة/الكتابة.
  3. دعم أنواع بيانات متعددة:
    • مثل: Dictionary (Key: String, Value: Any Data Type).

لماذا Redis مناسب؟

  1. التخزين المؤقت (Cache):
    • سريع جدًا لتخزين البيانات المؤقتة مثل الـ Basket.
  2. التزامن (Synchronization):
    • الـ Backend يمكنه الوصول للبيانات بسهولة.
  3. دعم السيناريوهات المتقدمة:
    • مثل Streaming (تيكتوك واللايفات).
    • الـMessage Broker للـ Microservices.

هيكل البيانات في Redis للـ Basket

Key-Value Pair:

  • الـKey: User ID أو Session ID.
  • الـValue: JSON يحتوي على المنتجات المضافة للـ Basket.
مثال:
KeyValue
user:123:basket{"productId": 1, "quantity": 2}
user:456:basket{"productId": 2, "quantity": 1}

الـClustering في Redis

  • البيانات بتتقسم على أكتر من خادم.
  • تحسين السرعة وتقليل وقت الـ Select.

ملخص:

  • أفضل حل لتخزين الـ Basket هو استخدام Memory Database مثل Redis.
  • المميزات:
    • سرعة الأداء.
    • مرونة التخزين المؤقت.
    • وصول مباشر للبيانات من الـ Backend.
  • التخزين في Redis بيجمع بين:
    • توفير التكاليف.
    • حل مشاكل Browser Storage.
    • تسريع العمليات باستخدام Clustering.

المفروض دلوقتي هنعمل الـ Basket Module أو زي الشوبينج في فتح الله، لما بتدخل بتاخد عربية وبتعمل Select للحاجات اللي عايز تشتريها في الباسكت بتاعتك وبعد ما بتخلص بتروح تحاسب وتشتريها، ودا نفسه اللي بيحصل في الـ E-Commerce


لو شوفت أي موقع بيع هتلاقي السلة بتتخزن بمعنى انك لو قفلته وفتحته تاني هتلاقي نفس اللي في الـ Cart لسا موجود فكدا انا بخزنها، نقول مثلًا لو بنخزنها في DB، بس دا مش هينفع لأن ممكن حرفيا أي حد يضيف كل المنتجات للسلة عادي فدا هيعملي مشاكل وهيبقا مكلف جدًا وكمان الداتا هتبقا Fake ومش هستفاد منها بأي حاجة انما تتخزن في الـ DB لما فعلًا عملية الشراء تتم

ممكن تبقا متخزنة في الـ Browser Storage فمعنى كدا انها بتتخزن عند الـ Client، بس دا هيعملنا مشكلتين:

  • لو اليوزر شغل البراوزر على جهاز تاني مش هيلاقيها
  • انا كـ Backend مليش Access على Browser Storage، وبحتاجها في الـ Marketing عشان أعرف ايه عجبك واعرضلك زيه وبتتباع وهكذا

بس هي بتتخزن في نوع من الـ DB اسمه Memory Database، هي بتبقا موجودة في الـ Memory بتاع الـ Server اللي هي الـ RAM، إنما الـ DB العادية بتبقا متخزنة في الـ Hard disc

فكدا حليت كذا مشكلة:

  • مشكلة الـ Access بتاعتي اتحلت وبقا ليا Access عليها
  • لسا متخزنتش في الـ DB بتاعتي
  • وفرت ان الداتا تروح للـ Hard، عشان هي في الطبيعي بتروح من الـ Ram للـ Hard فأنا مش هروح أعمل الرحلة دي
  • ممكن أتحكم في الـ Expiry بتاعتها انها تتمسح بعد اسبوع او شهر مثلًا

عندنا Tools كتير اشهرهم Redis وهي بتعمل in-memory data store بستدمها عشان نعمل database, Cashe, streaming engine and message broker يعني ممكن يبقا database عادي زي ما هنستخدمها النهاردة وممكن نعمل Cashe عادي بيها وممكن نستخدمها في الـ Streaming engine زي تيكتوك ولايفات وكدا وممكن Message broker بنستخدمه مع الـ Microservices عشان يعمل Manage الـ Interaction بين الـ Services اللي عندنا

Clustering, in-memory data structures (dictionary - Key: string, Value: any data type)

الـ Local storage for browser: برضو Key -value pair، بس فيها نفس المشاكل اللي قولناها قبل كدا وكمان لأن الـ Value بتبقا اما String أو JSON

الـ Clustering: بيقسم الـ Data على أكتر من Database عشان كدا بتبقا عملية الـ Select أسرع