pudge 500 صف قاعدة بيانات قابلة للتضمين على golang

pudge عبارة عن قاعدة بيانات للمفتاح / القيمة قابلة للتضمين ومكتوبة في مكتبة Go القياسية.

الصورة

سأتناول الخلافات الأساسية عن الحلول الحالية.

عديمي الجنسية

pudge.Set("../test/test", "Hello", "World") 

سيقوم Puj تلقائيًا بإنشاء قاعدة بيانات الاختبار ، بما في ذلك الدلائل الفرعية ، أو فتحها. ليست هناك حاجة لتخزين حالة الجدول ويمكنك تخزين القيم بأمان في التطبيقات متعددة الخيوط. Pooj هو موضوع آمن.

محرف

في puj ، يمكنك كتابة بايت أو سلاسل أو أرقام أو بنيات. دون الحاجة إلى القلق حول تحويل البيانات إلى تمثيلها الثنائي.

  type Point struct { X int Y int } for i := 100; i >= 0; i-- { p := &Point{X: i, Y: i} db.Set(i, p) } var point Point db.Get(8, &point) log.Println(point) 

نظام الاستعلام

يوفر Puj القدرة على استخراج المفاتيح بترتيب معين ، بما في ذلك التحديد مع حد المسافة البادئة والفرز والاختيار حسب البادئة.

  keys, _ := db.Keys(7, 2, 0, true) 

يشبه الرمز أعلاه استعلام SQL:

 select keys from db where key>7 order by keys asc limit 2 offset 0 

يرجى ملاحظة أن مفاتيح الفرز هي "كسولة". من ناحية أخرى ، يتم تخزين المفاتيح في الذاكرة ويتم تشغيلها بسرعة كبيرة.

التوازي

يستخدم Pooj ، مثله مثل معظم قواعد البيانات الحديثة ، نموذج قراءة غير مانع ، لكن الكتابة إلى ملف تحظر جميع العمليات. ولكن يمكنك إنشاء / فتح ملفات أثناء الطيران ، مما يقلل من عدد الأقفال. لا يوجد خطأ "تم فتح قاعدة البيانات بالفعل" في بوجا. مثال للاستخدام في HTTP router:

 func write(c *gin.Context) { var err error group := c.Param("group") counter := c.Param("counter") db, err := pudge.Open(group, cfg) if err != nil { renderError(c, err) return } _, err = db.Counter(counter, 1) if err != nil { renderError(c, err) return } c.String(http.StatusOK, "%s", "ok") } 

محركات

على الرغم من صغر حجمه ، فإن puj يدعم وضعي تخزين البيانات. في الذاكرة وعلى القرص. بشكل افتراضي ، يخزن puj فقط البيانات (القيم) على القرص. ولكن إذا كنت ترغب في ذلك ، يمكنك تمكين وضع تخزين البيانات في الذاكرة. في هذه الحالة ، سيتم مسحها على القرص عند الطلب ، أو عند إغلاق قاعدة البيانات.

الوضع

يتم استخدام Pooj في كل من المشاريع المنزلية والإنتاج ، على الرسم البياني أدناه - عدد الطلبات إلى خادم http بناءً على pooj ، وعدد الطلبات أطول من 20 مللي ثانية



في هذه الحالة ، يتم تشغيل puja في وضع التزامن الكامل ، وفي وقت fsync ، تحدث تأخير كبير (أكثر من 20 مللي ثانية). ولكن لحسن الحظ ، لا يوجد الكثير من حيث النسبة المئوية.

في صفحة المشروع ، يمكنك العثور على مزيد من الروابط مع أمثلة لدمج puja في مشاريع متنوعة.

السرعة

في المستودع مع benchmark'y يمكنك مقارنة puj مع قواعد البيانات الأخرى:

اختبار 1


 Number of keys: 1000000 Minimum key size: 16, maximum key size: 64 Minimum value size: 128, maximum value size: 512 Concurrency: 2 
pogreb
goleveldb
الترباس
badgerdb
الحلوى
البطيخ
pudge (mem)
1M (ضع + احصل) ، ثانية
187
38
126
34
23
23
2
1M وضع ، العمليات / ثانية
5336
34743
8054
33539
47298
46789
439581
1M الحصول على ، العمليات / ثانية
1782423
98406
499871
220597
499172
445783
1652069
حجم الملف ميغابايت
568
357
552
487
358
358
358

Pooja متوازن بشكل جيد في النسبة بين سرعة الكتابة وسرعة القراءة. أنها ليست قاعدة بيانات متخصصة للغاية الأمثل للقراءة أو الكتابة. بسرعة قراءة عالية - يتم الحفاظ على سرعة كتابة عالية إلى حد ما. والتي ، مع ذلك ، يمكن زيادتها عن طريق مزامنة التسجيلات مع الملفات المختلفة (كما هو الحال في محركات LSM Tree).

روابط لقواعد البيانات المستخدمة في الاختبار:

  • متجر pogreb المدمج ذو القيمة الأساسية لأحمال العمل الثقيلة للقراءة في Go
  • goleveldb LevelDB مفتاح / قيمة قاعدة البيانات في الذهاب.
  • الترباس قاعدة بيانات مفتاح / قيمة مضمن لـ Go.
  • badgerdb سريع القيمة الرئيسية DB في الذهاب
  • slowpoke مفتاح / قيمة منخفضة المستوى في متجر Go النقي (استنادًا إلى pudge)
  • pudge متجر مفاتيح / قيمة سريع وبسيط مكتوب باستخدام مكتبة Go القياسية

طلبوا مني المقارنة مع memcache و redis ، لكن بما أن نصيب الأسد من الوقت ينفق على واجهات الشبكة عند التفاعل مع بيانات قاعدة البيانات ، فإن هذا ليس عادلاً تمامًا. على الرغم من ذلك ، من ناحية أخرى ، يفوز بوجا بسبب تعدد العمليات ، على الرغم من أنه يكتب البيانات إلى القرص.

مزيد من التطوير

  • المعاملات سيكون من المناسب الجمع بين طلبات الكتابة إلى التجمع ، مع الاستعادة التلقائية في حالة حدوث خطأ.
  • القدرة على الحد من عمر المفتاح (مثل TTL في memcache / cassandra وغيرها)
  • عدم وجود خادم. من المريح تضمين puja في خدمات microservices الحالية ، ولكن على الأرجح سيظهر خادم منفصل. كجزء من مشروع منفصل.
  • نسخة الجوال. للاستخدام على أجهزة Android و iOS وكمكون إضافي لبرنامج Flutter.

Source: https://habr.com/ru/post/ar439216/


All Articles