UNIX用の標準キー/値データストア

UNIX用の標準キー/値データストア

私は知っていますコア価値UNIXライブラリ(Berkeleyデータベースデータベース管理システムレディス...).しかし、コーディングを始める前に、次のタスクを実行できるUNIX用の標準ツールがあるかどうかを知りたいです。

$ tool -f datastore.db put "KEY" "VALUE"
$ tool -f datastore.db put -f file_key_values.txt
$ tool -f datastore.db get "KEY"
$ tool -f datastore.db get -f file_keys.txt
$ tool -f datastore.db remove "KEY"
$ etc...

ありがとう

答え1

私はこれを行うことができる標準的なツールがないと思います。grep//awkなどを除いてsed。ただし、これを使用すると、ロック、書式設定、特殊文字などの他の多くの問題について心配する必要があります。

使用することをお勧めしますsqlite。単純なテーブルを定義し、関数を作成してtool_get()シェルtool_put()します。sqliteポータブルで高速です。

無料で追加の柔軟性を得ることができます。制約、インデックスを定義してスクリプトを調整したり、ある日は別の言語でデータベースを使用したりできます。

答え2

データベースが十分に小さい場合は、ファイルシステムを使用できます。このアプローチの利点は、技術レベルが非常に低く、コードがほとんどなくてもどこでも作業できることです。キーが印刷可能な文字で構成されていて含まれていない場合は、/ファイル名として使用できます。

put () { key=$1; value=$2; printf %s "$value" >"datastore.db/$key"; }
get () { key=$1; cat "datastore.db/$key"; }
remove () { key=$1; rm "datastore.db/$key"; }

任意のキーを受け入れるには、キーのチェックサムをファイル名として使用し、オプションでキーのコピーを保存します(キーをリストできないか、特定のアイテムのキーが何であるかわからないことに満足しない限り)。

put () {
  key=$1; value=$2; set $(printf %s "$key" | sha1sum); sum=$1
  printf %s "$key" >"datastore.db/$sum.key"
  printf %s "$value" >"datastore.db/$sum.value"
}
get () {
  key=$1; set $(printf %s "$key" | sha1sum); sum=$1
  cat "datastore.db/$1.value"
}
remove () {
  key=$1; set $(printf %s "$key" | sha1sum); sum=$1
  rm "datastore.db/$1.key" "datastore.db/$1.value"
}

上記のおもちゃの実装は完全な内容ではありません。有用な情報はまったくありません。不動産取引原子性のようなもの。ただし、ファイルの作成や名前変更などの基本的なファイルシステム操作はアトミックであり、上記の関数のアトミックバージョンを構築できます。

これらの直接ファイルシステムの実装は、小規模データベース(最大数千のファイル)の一般的なファイルシステムにのみ適しています。それに加えて、ほとんどのファイルシステムは大きなディレクトリのために困難を経験します。階層レイアウトを使用して、このスキームをより大きなデータベースに適用できます。たとえば、すべてのファイルを1つのディレクトリに保存するのではなく、ファイル名の最初の数文字に基づいて別々のサブディレクトリに保存します。これは何ですか?たとえば、対応するオブジェクト(SHA-1ハッシュで索引付けされている)は.git/objects/01/2345679abcdef0123456789abcdef01234567ワープラそしてポリボ;両方とも、URLで見つかったページのキャッシュされたコピーをファイルに保存します。www.example.com/HASHここで、HASHはURLの一部のハッシュエンコーディングです。

非効率性のもう一つの原因は、ほとんどのファイルシステムが小さなファイルを保存するときに多くのスペースを無駄にすることです。ファイルサイズに関係なく、通常のファイルシステムではファイルあたり最大2kBまで可能です。

物理データベースを使用することを選択した場合は、透過的なファイルシステムアクセスの利便性を放棄する必要はありません。いくつかあります。ヒューズファイルシステムデータベースにアクセスするBerkeleyデータベースが含まれています(Jeff Garzikのdbfs)、Oracle(Oracleデータベースファイルシステム)、MySQL(mysqlfs)、等。

1 同様のURLの場合、http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unixPolipoはファイルを使用しunix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==、ファイル内に実際のURLをプレーンテキストで表すヘッダーを追加します。ファイル名はURLのMD5ハッシュ(バイナリ)をBase64でエンコードします。 Wwwoffleはこのファイルを使用しますhttp/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw。ファイル名はMD5ハッシュのローカルエンコーディングで、付属のファイルにはhttp/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhwURLが含まれています。

答え3

dbmutilあなたはあなたが望むものを得ることができます。あなたの質問に説明するタスクのためのシェルユーティリティがあります。正確には標準とは言えませんが、ご希望のアメニティが揃っています。

答え4

使いたいならGBBM GNUデータベース

Debianベースのオペレーティングシステム(buster)でテストされました。

apt install gdbmtool

標準入力からコマンドを読み取るには、 bash gdbmtool を使用します。

$ gdbmtool -s datastore.gdbm <<<"store KEY VALUE"
  # load from file (rows format "key: value")
$ gdbmtool -s datastore.gdbm < <(awk -F: '{print "store "$1" "$2}'  file_key_values.txt)
$ gdbmtool -s datastore.gdbm <<< "fetch KEY"
  # fetch many keys (only values outputed in order)
$ gdbmtool -s datastore.gdbm < <(awk '{print "fetch "$1}' file_keys.txt)
$ gdbmtool -s datastore.gdbm <<<"delete KEY"
$ gdbmtool -s datastore.gdbm list

詳細については、次を参照してください。man gdbmtool

ダンプ

$ gdbm_dump datastore.gdbm > mydump.txt

ロードダンプ

$ gdbm_load mydump.txt datastore.gdbm

関連情報