10 ポイント 投稿者 GN⁺ 2024-04-15 | 2件のコメント | WhatsAppで共有
  • Redkaは、Redisの利点をSQLiteで再実装しつつ、Redis APIとの互換性を持たせることを目標としている
  • 主な特徴:
    • データをRAM容量に収める必要がない
    • ACIDトランザクションをサポート
    • SQLビューによってデータ参照やレポーティング機能を強化
    • In-process(Go API)とStandalone(RESP)サーバーの両方をサポート
    • Redis互換のコマンドとプロトコルをサポート
  • 現在も開発が進行中で、対応状況とロードマップは以下のドキュメントを参照

対応コマンド

  • Redkaは、Redisの5つの中核データ型であるString、List、Set、Hash、Sorted Setをサポートすることを目標としている
  • String、Hash、Key管理、トランザクションコマンドはすでに対応しており、List、Set、Sorted Setは開発中
  • 詳細なコマンド一覧は原文を参照

インストール方法

スタンドアロンサーバー

  • ReleaseページからOSに合ったバイナリをダウンロードして実行
  • Dockerを使う場合は docker pull nalgeon/redka でイメージをダウンロード

Goモジュール

  • go get github.com/nalgeon/redka でモジュールをインストール
  • SQLiteドライバーとして github.com/mattn/go-sqlite3 または modernc.org/sqlite を使用

使い方

スタンドアロンサーバー

  • ダウンロードしたバイナリを redka [-h host] [-p port] [db-path] の形式で実行
    • デフォルトは host localhost、port 6379、DBパスなし(インメモリ)
  • Docker使用時は docker run コマンドで実行。詳しいオプションは原文を参照
  • サーバー起動後は redis-cliredis-pygo-redis のようなRedis互換クライアントで接続可能

In-processサーバー

  • redka.Open() 関数でDBオブジェクトを作成。ドライバーのインポートが必須
  • redka.DB オブジェクトのメソッドを呼び出して各種コマンドを実行
  • View(読み取り専用)と Update(書き込み可)メソッドでトランザクション処理

永続性

  • RedkaはSQLiteデータベース内の rkey、rstring、rhash テーブルを使ってデータを保存
  • 各データ型ごとのビュー(vstring、vhash など)を通じて、SQLでデータを参照可能

パフォーマンス

  • redis-benchmark ツールでRedisとRedkaの性能を比較
    • RedkaはSETで約6倍、GETで約2倍遅い
    • それでも毎秒23K writes、57K reads程度の性能を示す
  • コンテナ上で実行した場合、性能低下が起こる可能性がある

ロードマップ

  • 1.0リリースではRedis 2.x時代の主要機能を中心に実装予定
    • String、Hash、Key管理、トランザクション対応は完了
    • Sorted Setは開発中
    • List、Setは今後開発予定
  • 今後のバージョンでは、Stream、HyperLogLog、Geoのようなデータ型やPub/Sub機能を追加予定
  • Luaスクリプティング、認証/ACL、マルチDB、Watch/Unwatchなどは実装予定なし
  • クラスターとSentinel機能も実装しない予定

GN⁺の意見

  • Redisと大部分で互換性を保ちながら永続性を提供するRedkaのアプローチは興味深いです。ACIDトランザクションをサポートしている点も強みになりそうです。
  • パフォーマンス面ではRedisには及ばないものの、永続性が必要な場合には十分に検討に値する代替案だと思います。
  • ただし、まだ開発初期段階なので、安定性についてはもう少し見守る必要がありそうですし、ロードマップから外れている機能がかなりある点は、実運用で導入する際の考慮事項です。
  • インメモリ用途では最終的にRedisに勝てないでしょうが、SQLiteベースの永続性レイヤーとしては有用に使えそうです。
  • 最近はエッジコンピューティング環境で軽量スタックへの需要が高まっており、そのような分野ではRedisの代わりにRedkaを使ってみる価値がありそうです。

2件のコメント

 
yangeok 2024-05-10

スケジューラにredisを付ける必要があるときに使うと便利そうですね(笑)

 
GN⁺ 2024-04-15
Hacker Newsの意見
  • Redisの「すべてが1つのスレッドで直列化される」非並行モデルを、どの程度踏襲するか考える必要がある
  • SQLiteの低レベルライブラリを使い、WALを有効にし、読み取り用goroutineごとにコネクションを使い、専用のwriterスレッドへバッファ付きチャネル/キュー経由で書き込みバッチを送れば、SQLiteでより高い性能を得られる
  • これにより、SQLiteの組み込みのコネクション単位ミューテックスを無効にしても、各コネクションが同時に1つのスレッドでしか使われないため、スレッドセーフ性を維持できる
  • ネットワーク要求/ソケットから入ってくるパラメータのバイト列をバッファにコピーしたり、SQLiteから直接ソケットへコピーしたりするなど、arenaスタイルの大きなバッファを使えば、個々の文字列の割り当てと受け渡しを減らし、大幅な時間短縮になる
  • GoからSQLiteの最大書き込みスループットを引き出そうとした経験から得たヒントである
  • RedisもSQLiteも好きなので、両者を組み合わせることにした。SQLiteは多数の小さなクエリに特化しており、リレーショナルエンジンがRedisに近づける限り近づいているため、相性が良さそうだ
  • TigerBeetleの状態マシンを置き換えてRedis APIを実装する誰かを待っている
  • データセットがメモリに収まるかどうかを気にしなくてよいRedis代替があればよい
  • Redisの価値提案全体は、メモリ上で動作してメモリ並みの性能を提供することにある。ディスクに移れば、Redisを使う理由はほとんどない
  • ネットワークI/Oが加わると、Redisの素晴らしい性能の多くは失われる。SaaSホスティングのRedisサービスを使うと性能は大きく低下する。自前のクラスターでRedis互換のキー/バリューストアをより簡単に動かせるなら、それは利点だ
  • これとGarnetのどちらがより多くのRedisコマンドをサポートしているのか気になる。ローカルデバッグ目的で、プログラムにRedis互換機能のサブセットを組み込みたいのだが、その手前にAPIがあり、未サポートのRedisコマンドを防げるようになっている
  • FoursquareがMongoDBを有名にした頃、誰かがMySQL上に実装したNoSQL DBのPoCを公開していたが、流行はしなかった。しかし、DBが必要になるたびにSQLを再発明しなくて済むようにするために、どれだけの性能を犠牲にしてきたのかを考えさせられる。こうした実験は好きで、時には新しいプロジェクトにつながる
  • DBの前段にキャッシュレイヤーとしてRedisを使っている。この発想は理解できない
  • ただし、SetMaxConnections(1)を使っている一方で、SQLiteはWALモード(使用中)では読み取りをブロックしない書き込みをサポートするので、読み取りの並行性を許可すれば利点があるかもしれない