10 puan yazan GN⁺ 2024-04-15 | 2 yorum | WhatsApp'ta paylaş
  • Redka, Redis'in avantajlarını SQLite üzerinde yeniden hayata geçirirken Redis API'siyle uyumlu olmayı hedefliyor
  • Başlıca özellikler:
    • Verilerin RAM boyutuna sığması gerekmiyor
    • ACID işlemleri desteği
    • SQL görünümleri üzerinden veri sorgulama ve raporlama yetenekleri güçlendirildi
    • Hem in-process (Go API) hem de standalone (RESP) sunucu desteği
    • Redis uyumlu komutlar ve protokol desteği
  • Şu anda aktif geliştirme altında; destek durumu ve yol haritası için aşağıdaki belgelere bakın

Desteklenen komutlar

  • Redka, Redis'in 5 temel veri tipini desteklemeyi hedefliyor: String, List, Set, Hash, Sorted Set
  • String, Hash, anahtar yönetimi ve işlem komutları zaten destekleniyor; List, Set ve Sorted Set ise geliştirme aşamasında
  • Ayrıntılı komut listesi için özgün metne bakın

Kurulum

Bağımsız çalışan sunucu

  • Release sayfasından işletim sisteminize uygun ikili dosyayı indirip çalıştırın
  • Docker kullanacaksanız imajı docker pull nalgeon/redka ile indirin

Go modülü

  • Modülü go get github.com/nalgeon/redka ile kurun
  • SQLite sürücüsü olarak github.com/mattn/go-sqlite3 veya modernc.org/sqlite kullanın

Kullanım

Bağımsız çalışan sunucu

  • İndirdiğiniz ikili dosyayı redka [-h host] [-p port] [db-path] biçiminde çalıştırın
    • Varsayılan değerler: host localhost, port 6379, DB yolu yok (bellek içi)
  • Docker kullanıyorsanız docker run komutuyla çalıştırın. Ayrıntılı seçenekler için özgün metne bakın
  • Sunucu çalıştıktan sonra redis-cli, redis-py, go-redis gibi Redis uyumlu istemcilerle bağlanabilirsiniz

In-process sunucu

  • redka.Open() fonksiyonuyla bir DB nesnesi oluşturun. Sürücünün import edilmesi zorunludur
  • Çeşitli komutları çalıştırmak için redka.DB nesnesinin metotlarını çağırın
  • İşlemleri View (salt okunur) ve Update (yazılabilir) metotlarıyla yönetin

Kalıcılık

  • Redka verileri SQLite veritabanında rkey, rstring, rhash tablolarını kullanarak saklar
  • Her veri tipi için vstring, vhash gibi görünümler üzerinden verilere SQL ile erişilebilir

Performans

  • Redis ve Redka performansı redis-benchmark aracıyla karşılaştırılmış
    • Redka, SET'te yaklaşık 6 kat, GET'te ise yaklaşık 2 kat daha yavaş
    • Buna rağmen saniyede 23K yazma, 57K okuma düzeyinde performans gösteriyor
  • Konteyner içinde çalıştırıldığında performans düşüşü olabilir

Yol haritası

  • 1.0 sürümünde Redis 2.x döneminin ana özelliklerine odaklanan bir uygulama planlanıyor
    • String, Hash, anahtar yönetimi ve işlem desteği tamamlandı
    • Sorted Set geliştirme aşamasında
    • List ve Set planlanıyor
  • Gelecek sürümlerde Stream, HyperLogLog, Geo gibi veri tipleri ile Pub/Sub özelliğinin eklenmesi planlanıyor
  • Lua scripting, authentication/ACL, multi DB, Watch/Unwatch gibi özelliklerin uygulanması planlanmıyor
  • Cluster ve Sentinel özellikleri de uygulanmayacak

GN⁺ görüşü

  • Redis ile büyük ölçüde uyumlu olurken kalıcılık da sunan Redka'nın yaklaşımı ilgi çekici. ACID işlemlerini desteklemesi de bir avantaj olabilir.
  • Performans açısından Redis'in gerisinde kalsa da, kalıcılığın gerekli olduğu durumlarda değerlendirmeye değer bir alternatif gibi görünüyor.
  • Ancak henüz geliştirme sürecinin başlarında olduğu için kararlılık açısından biraz daha izlemek gerekiyor; ayrıca yol haritasında yer almayan epey özellik olması da gerçek kullanımda dikkate alınmalı.
  • Bellek içi kullanım için sonuçta Redis'i geçmesi zor, ancak SQLite tabanlı bir kalıcılık katmanı olarak faydalı olabilir.
  • Son dönemde edge computing ortamlarında hafifletilmiş stack'lere olan talep artıyor; böyle alanlarda Redis yerine Redka denenebilir.

2 yorum

 
yangeok 2024-05-10

Zamanlayıcıya Redis bağlanması gerektiğinde kullanışlı olabilir gibi görünüyor :)

 
GN⁺ 2024-04-15
Hacker News görüşleri
  • Redis’in “her şeyin tek bir iş parçacığında serileştirildiği” eşzamanlılıksız modelini ne ölçüde takip etmek gerektiği konusunda kafa yorma var
  • SQLite’ın düşük seviye kütüphanesini kullanıp, WAL’i etkinleştirip, her okuma amaçlı goroutine için bir bağlantı kullanıp, yazma batch’lerini tamponlu kanal/kuyruk üzerinden ayrılmış bir writer iş parçacığına gönderirseniz SQLite’tan daha iyi performans alınabilir
  • Bu sayede SQLite’ın bağlantı başına yerleşik mutex’lerini kapatıp yine de iş parçacığı güvenliğini koruyabilirsiniz; çünkü her bağlantı aynı anda yalnızca tek bir iş parçacığında kullanılır
  • Ağ isteklerinden/soketlerden gelen parametre baytlarını bir tampona kopyalamak ya da SQLite’tan doğrudan sokete kopyalamak gibi arena tarzı büyük tamponlar kullanmak, tek tek string tahsisi ve aktarımını azaltarak ciddi zaman kazandırabilir
  • Bunlar, Go’da SQLite’tan azami yazma throughput’u almaya çalışırken edinilmiş ipuçları
  • Hem Redis’i hem de SQLite’ı sevdiğim için ikisini birleştirmeye karar verdim. SQLite çok sayıda küçük sorguda uzmanlaştı; ilişkisel bir motorun Redis’e yaklaşabileceği kadar yaklaştı, bu yüzden iyi bir uyum gibi görünüyor
  • Redis API’sini uygulamak için TigerBeetle’ın durum makinesini değiştirecek birini bekliyorum
  • Veri kümesinin belleğe sığıp sığmadığını düşünmeyi gerektirmeyen bir Redis alternatifi güzel olurdu
  • Redis’in tüm değer önerisi, bellekte çalışıp bellek benzeri performans sunmasıdır. Diske geçince Redis kullanmak için pek bir neden kalmıyor
  • Ağ I/O’su eklendiğinde Redis’in harika performansının büyük kısmı kayboluyor. SaaS olarak barındırılan Redis hizmetleri kullanıldığında performans ciddi darbe alıyor. Kendi cluster’ınızda Redis uyumlu bir anahtar/değer deposunu daha kolay çalıştırabilmek bir avantaj olur
  • Bunun mu yoksa Garnet’in mi daha fazla Redis komutunu desteklediğini merak ediyorum. Yerel debugging amacıyla bir programa Redis uyumlu özelliklerin bir alt kümesini gömmek istiyorum; arada bir API olduğundan desteklenmeyen Redis komutlarına karşı koruma sağlanabilir
  • Foursquare MongoDB’yi meşhur ettiğinde biri MySQL üzerinde uygulanmış bir NoSQL DB PoC’si yayımlamıştı ama yaygınlaşmadı. Yine de, ne zaman bir DB’ye ihtiyaç duysak SQL’i yeniden icat etmemek için ne kadar performanstan vazgeçtiğimizi düşündürüyor. Bunun gibi deneyleri seviyorum; bazen yeni projelere dönüşüyorlar
  • Redis’i DB’nin önünde bir cache katmanı olarak kullanıyorum. Bu kavramı anlamıyorum
  • Ama SetMaxConnections(1) kullanıyorsanız, SQLite WAL modunda (ki burada kullanılıyor) okumaları engellemeyen yazmaları desteklediğinden, okuma eşzamanlılığına izin vermenin faydası olabilir