بسم الله الرحمن الرحيم

في سلسلة المقالات دي، هنشرح خطوة بخطوة بشكل مبسط ازاي نقدر نكتب In Memory Database زي Redis. و الهدف منها هو محاوله تبسيط و شرح الـ Low Level Details اللي بتتعامل معها في الـ Databases و الـ DataStructures و الـ Algorithms. و اختيار Redis هو بسبب بساطتها نفسها كاداه و سهوله فهمها.

احنا هنبني ايه؟

سلسلة المقالات دي هدفها من الاول للاخر انك تبني InMemory Database زي Redis. و المقصود بانها زي Redis انها هتبقي فيها شويه اوامر من اللي موجودين في Redis و الجزء المهم هو ازاي تخزن البيانات دي علي الـDisk و تقرها تاني علي الـMemory لما تشغل الـServer.

و اللغه اللي هنستخدمها هي Go نظرا لسهولة الكود بتاعها و ان فيه قواعد بيانات كتير اتكتب بيها بالفعل زي boltdb و diskv

Intro

اللي هنعمله اننا:

  • هنبني Redis clone بتقدر من خلاله تستخدم strings و hashes.
  • هنكتب Parser علشان نقدر نفهم RESP و منه السيرفر يقدر يستقبل commands و يرد بـ responses.
  • هنسخدم go routines علشان نقدر نستقبل اكتر من connection في نفس الوقت
  • و هنكتب البيانات علي الـDisk عن طريق الـ Append Only File (AOF) ودي طريقه Redis بيستخدمها من ضمن عده طرق تانيه عنده. بالتالي السيرفر لو حصله crash او restart نقدر نرجع البيانات تاني

لو فيه مصطلحات مش فاهمها دلوقتي متشغلش بالك بيها و هتفهما بعدين واحنا بنتكلم علي كل جزء

و الكود بتاعنا ف الاخر هيبقي عباره عن 4 ملفات سهل تقراها و تفهمها اي وقت

.
├── aof.go
├── handler.go
├── main.go
└── resp.go

ليه ممكن اقرأ المقالات دي؟

لو انت Software Developer ف انت اكيد في شغلك اليومي بتتعامل مع الـ Databases. و الـdatabases نفسها بتشتغل بشكل معقد و بيبقي فيها concepts كتير جدا علشان تسهل عليك كـ end user انك تخزن بياناتك و تتعامل معاهها سواء هتعمل عمليات معقده او مبسطه. معظم المقالات والكورسات اللي بتشرح قواعد البيانات. بتتكلم بس عن الـ high level details و ازاي تستخدمها. بس قليل لما تلاقي مقالات بتشرحلك ده ازاي بيشتغل من الداخل. زي مثلا الـ Indexes، ازاي بتتعمل و بتتخزن شكلها عامل ازاي؟ و ازاي الdatabase بتقرر اي index هستخدمه حسب ال Query.

ف بعد بحث و قراءه كتب مختلفه زي Database Internal و مقالات زي Lets build a simple database (sqlite clone). قررت اني ابدا اعمل database بنفسي و احاول اطبق فيها الconcepts اللي انا مهتم بيها، من باب “What I cannot create, I do not understand” - Richard Feynman.

و حبيت انقل التجربه دي بالعربية نظراً لقله المحتوي الموجود اللي بيتكلم في الموضوع ده. واللي هنبنيه في المقالات دي هيبقي حجر اساس مناسب اننا نكتب مقالات اكتر عن قواعد البيانات المعقده عن Redis زي SQLite, MySQL, PostgreSQL, MongoDB.

هل المقالات مناسبه لي و هعرف اقرأها؟

انا حاولت وانا بكتب كل سطر في المقالات دي ان الكلام يكون بسيط و مباشر. و الكود متقسم علي اجزاء علشان تقدر تفهم كل جزء بيعمل ايه و الكود بتاعه شكله ايه قبل ما نجمع الكود كله مع بعضه ونشغله كحاجة واحدة. و لكن هيحتاج من القارئ انه يكون عنده خلفيه عن الكام نقطة دول.

  • ✅ بعرف اقرا كود Go و افهمه حتي لو بشكل بسيط
  • ✅ اتعاملت مع Redis قبل كدا و عندي خلفيه عن الـ Commands بتاعتها

حتي لو متعرفش Go و Redis. تقدر بردو تقرا المقالات و اكيد هتلاقي حاجات مفيده