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


16

UNIXのキー/値ライブラリ(berkeleydbgdbmredis ...)について知っています。しかし、コーディングを始める前に、次の操作を実行できる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...

ありがとう

回答:


10

そのための標準的なツールはないと思います。grep/ awk/ sedなどを除く。ただし、これを使用すると、ロック、フォーマット、特殊文字など、他の多くの問題に注意する必要があります。

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

無料で追加の柔軟性が得られます。いつか制約を定義したり、インデックスを作成してスクリプトを微調整したり、他の言語でそのDBを使用したりできます。


ありがとうございました 。私はすぐにsqlite APIを使用してツールを作成しました。正常に動作します。
ピエール

9

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

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つのディレクトリに保存するのではなく、名前の最初の数文字に基づいて別々のサブディレクトリに保存します。これはgitが行うことです。たとえば、SHA-1ハッシュでインデックス付けされたオブジェクトは、というファイルに保存されます.git/objects/01/2345679abcdef0123456789abcdef01234567。セマンティックレイヤーを使用するプログラムの他の例は、WebキャッシングプロキシWwwofflepolipoです。どちらも、URLで見つかったページのキャッシュコピーをというファイルに保存しますwww.example.com/HASH HASHはURLのハッシュのエンコードです。¹

非効率性の別の原因は、ほとんどのファイルシステムが小さなファイルを保存するときに多くのスペースを浪費することです。ファイルのサイズに関係なく、一般的なファイルシステムではファイルごとに最大2kBの無駄があります。

実際のデータベースを使用することを選択した場合、透過的なファイルシステムアクセスの利便性を放棄する必要はありません。Berkeley DB(Jeff Garzikのdbfsを使用)、Oracle(Oracle DBFSを使用)、MySQL(mysqlfsを使用)などを含むデータベースアクセスするためのFUSEファイルシステムがいくつかあります

¹の ようなURLの場合http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix、Polipoはファイルを使用します。ファイルunix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==内にヘッダーが追加され、実際のURLがクリアテキストで示されます。ファイル名は、URLのMD5ハッシュ(バイナリ)のbase64エンコードです。Wwwoffleはファイルを使用しますhttp/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw。ファイルの名前はMD5ハッシュの自家製のエンコーディングであり、コンパニオンファイルhttp/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhwにはURLが含まれています。


7

dbmutilあなたが望むものを得るかもしれません。質問で説明する操作用のシェルユーティリティがあります。正確に標準だとは言いませんが、必要な機能は備えています。


5

名前を付けたので、標準のredisクライアントにはを介したコマンドラインインターフェイスがありますredis-cli。からのいくつかの例redis-cli -h

 cat /etc/passwd | redis-cli -x set mypasswd
 redis-cli get mypasswd
 redis-cli -r 100 lpush mylist x

(そして、ファイルシステムを介してdbにアクセスしたい場合は、ソケットを使用できます-s。各呼び出しでdbインデックスを直接読み取るツールは、非常に非効率的です。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.