golangでKVSサーバーを実装してみた

golangの勉強がてらKVSのDBサーバーを雑に実装してみた。
DBの実装自体はbuntdbというライブラリをそのまま使っているので、あまり大した事はやっていないけど。

実装したDBサーバーについて

  1. OrenoDBという名付けた(メンテするつもりはないので雑な命名)
  2. メモリベースのkey-valueストア
  3. ポート8888固定でtcp接続を待ち受ける
  4. redisプロトコルを採用したので一般的なRedisクラアントライブラリで接続できる

github.com

全体構成

大体こんな感じで実装されている。

  1. DBサーバーを起動して8888ポートで待ち受ける。
  2. clientが8888に接続しにくる。
  3. DBサーバーはclientを受け入れてgoroutineを起動する。
  4. groutineではclientからデータが送信されてくるのを待ち受ける。
  5. clientから送られた文字列を溜め込んで、コマンドとして解釈可能なレベルまで文字列が溜まるのを待つ。
  6. コマンドとして解釈可能なら、それを使ってDBエンジンにデータをRead/Writeしに行く。

f:id:y_d:20180418005307p:plain

その他

  • 軽く試した感じRedisよりもRead/Writeが速かった。これはBuntDBがredisよりも速い実装だから当たり前だけど。※index貼っていないので貼るともっと速くなるかも。
  • goroutineとchannelをうまく使いこなせていないのでgoroutineがリークしてるかもしれないのと、適当な実装がたくさんある。