pudge adalah database nilai / kunci yang dapat ditanam yang ditulis dalam pustaka Go standar.
Saya akan membahas perbedaan mendasar dari solusi yang ada.
Tanpa kewarganegaraanpudge.Set("../test/test", "Hello", "World")
Puj akan secara otomatis membuat database pengujian, termasuk sub direktori, atau membukanya. Tidak perlu menyimpan status tabel dan Anda dapat menyimpan nilai dengan aman di aplikasi multi-utas. Pooj aman untuk thread.
TypefreeDi puj, Anda dapat menulis byte, string, angka, atau struktur. Tanpa khawatir tentang konversi data ke representasi biner mereka.
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)
Sistem permintaanPuj menyediakan kemampuan untuk mengekstrak kunci dalam urutan tertentu, termasuk pemilihan dengan batas, lekukan, penyortiran, dan pemilihan dengan awalan.
keys, _ := db.Keys(7, 2, 0, true)
Kode di atas mirip dengan permintaan SQL:
select keys from db where key>7 order by keys asc limit 2 offset 0
Harap dicatat bahwa kunci penyortiran adalah "malas." Di sisi lain, tombol disimpan dalam memori dan itu berjalan cukup cepat.
ParalelismePooj, seperti kebanyakan database modern, menggunakan model baca non-blocking, tetapi menulis ke file memblokir semua operasi. Tetapi Anda dapat membuat / membuka file dengan cepat, meminimalkan jumlah kunci. Tidak ada kesalahan "database sudah dibuka" di puja. Contoh penggunaan di router http:
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") }
MesinMeskipun ukurannya kecil, puj mendukung dua mode penyimpanan data. Di memori dan di disk. Secara default, puj hanya menyimpan data (nilai) pada disk. Tetapi jika Anda mau, Anda dapat mengaktifkan mode menyimpan data dalam memori. Dalam hal ini, mereka akan dibilas ke disk atas permintaan, atau ketika database ditutup.
StatusPooj digunakan baik dalam proyek-proyek rumah dan dalam produksi, pada grafik di bawah ini - jumlah permintaan ke server http berdasarkan puj, dan jumlah permintaan lebih dari 20 ms

Dalam hal ini, puja dihidupkan dalam mode sinkronisasi penuh, dan, pada saat fsync, terjadi keterlambatan yang signifikan (lebih dari 20 ms). Namun untungnya, tidak begitu banyak dalam hal persentase.
Pada halaman
proyek Anda dapat menemukan lebih banyak tautan dengan contoh-contoh mengintegrasikan puja ke berbagai proyek.
KecepatanDalam
repositori dengan benchmark'y Anda dapat membandingkan puj dengan database lain:
Tes 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
| baut
| badgerdb
| puding
| slowpoke
| pudge (mem)
|
1 jt (Put + Get), detik
| 187
| 38
| 126
| 34
| 23
| 23
| 2
|
1 jt, ops / dtk
| 5336
| 34743
| 8054
| 33539
| 47298
| 46789
| 439581
|
1 jt Get, ops / dtk
| 1782423
| 98406
| 499871
| 220597
| 499172
| 445783
| 1652069
|
Mb Ukuran File
| 568
| 357
| 552
| 487
| 358
| 358
| 358
|
Pooja sangat seimbang dalam rasio antara kecepatan tulis dan kecepatan baca. Itu bukan database yang sangat khusus dioptimalkan untuk membaca atau menulis. Pada kecepatan baca tinggi - kecepatan tulis yang cukup tinggi dipertahankan. Namun, yang dapat lebih ditingkatkan dengan memparalelkan rekaman ke file yang berbeda (seperti yang dilakukan di mesin LSM Tree).
Tautan ke basis data yang digunakan dalam pengujian:
- pogreb Toko nilai kunci tertanam untuk beban kerja baca-berat yang ditulis dalam Go
- goleveldb LevelDB key / database nilai di Go.
- baut Basis data kunci / nilai tertanam untuk Go.
- badgerdb DB nilai kunci cepat di Go
- slowpoke Penyimpanan kunci / nilai tingkat rendah di Go murni (berdasarkan pudge)
- pudge Penyimpanan kunci / nilai yang cepat dan sederhana yang ditulis menggunakan perpustakaan standar Go
Mereka meminta saya untuk membandingkan dengan memcache dan redis, tetapi karena sebagian besar waktu dihabiskan untuk antarmuka jaringan ketika berinteraksi dengan data database, ini tidak sepenuhnya adil. Meskipun, di sisi lain, puja menang karena multithreading, meskipun ia menulis data ke disk.
Pengembangan lebih lanjut- Transaksi Akan lebih mudah untuk menggabungkan permintaan tulis ke kumpulan, dengan rollback otomatis jika terjadi kesalahan.
- Kemampuan untuk membatasi masa pakai kunci (seperti TTL dalam memcache / cassandra dll)
- Kurangnya server. Lebih mudah untuk menanamkan puja di microservices yang ada, tetapi kemungkinan besar server terpisah akan muncul. Sebagai bagian dari proyek terpisah.
- Versi seluler. Untuk digunakan di Android, iOS dan sebagai plugin untuk Flutter.