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.