[PROJE]
Redis Clone
TCP üzerinden RESP protokolünü uygulayan Redis uyumlu sunucu projesi. In-memory veri yapıları ve protokol parsing'e sahip.
[YIL]
2024
[TÜR]
Açık Kaynak Projeleri
[DURUM]
Prototip Tamamlandı
Özet
Codecrafters üzerinden, yapılandırılmış bir challenge olarak başladığım bir başka projem. Rust öğrenmeye bir ay ara verdiğim 2024’te başladım.
Redis hakkında bildiğim tek şey, anahtar-değer tabanlı bir veritabanı olduğuydu. Nasıl kullanılacağını öğrenmeyi hep istedim ama hiç fırsatım olmadı. Bu yüzden Typescript ile bir redis klonu yapmaya karar verdim.
Önce rehber bana redis için bazı temel komutları ve RESP protokolünün temel kullanımını tanıttı. Sonra işler karmaşıklaştı ve eksiksiz bir RESPv2 protokolü uygulaması gerekli hale geldi.
Protokolü uygulamak için Redis dokümantasyonunu tekrar tekrar okumak gerekir. Bir insan dokümanları okuduğunu ve kuralları gerçekten iyi uyguladığını düşünse bile sorunlar çıkacaktır. Bu sorunları çözmek için bol bol test yazmak gerekir. Sonra da onları debug etmek.
Çünkü protokollerin nasıl çalıştığını öğrenmek, redis’in onları nasıl kullandığından farklıdır. Ve redis hakkında hiçbir şey bilmemek de işe yaramaz. Uzun doküman okuma oturumları, bolca debug oturumu ve yeniden yazmaların ardından RESPv2 protokolünün ayrıştırma ve serileştirme işlemlerini tamamladım.
Sonra komut sayısı artmaya başladı. if else blokları içler acıtırcasına çirkin görünmeye başladı. Bu yüzden komutları farklı dosyalara ayırmaya ve bir komut yönlendirici oluşturmaya karar verdim.
export default class ServerHandler {
commands: Map<string, ServerAction<RESPv2Data>> = new Map([
["ping", ping],
["echo", echo],
["set", this.useDatabase(set)],
["get", this.useDatabase(get)],
["info", this.useRole(info)],
["pong", this.useRole(pong)],
]);
public run: CommandRunner = (command: string, data: RESPv2Data[]) => {
return this.commands.has(command.toLowerCase())
? this.commandRunner(data, this.commands.get(command.toLowerCase()) as ServerAction<RESPv2Data>)
: this.sendError('Unknown command');
};
}
Özellikler
data-structures
parsing
serialization-deserialization
command-routing
Etiketler
typescript
rust
tcp
redis
web
backend
system-programming
protocol-parsing
Öne Çıkan Projeler
Mezuniyet Projesi
Arduino düğümleri arasında sensör verilerini iletmek için Görünür Işık İletişimi kullanan, gerçek zamanlı izleme için React tabanlı web paneli olan bir sera izleme ve kontrol sistemi.
Projeyi Gör >>krustie
TCP katmanından başlanarak, Rust ile yazılmış, deneysel bir backend HTTP framework'ü. Özel parser'a, middleware pipeline'ına ve immutable request desteğine sahip.
Projeyi Gör >>mrcn.tr
Actix Web, Diesel.rs, PostgreSQL, Astro, React ve TailwindCSS ile geliştirilmiş kişisel full-stack web sitesi.
Projeyi Gör >>