UNIX용 표준 키/값 데이터 저장소

UNIX용 표준 키/값 데이터 저장소

나는 대해 알고있다핵심가치UNIX 라이브러리(버클리 데이터베이스,데이터베이스 관리 시스템,레디스...). 하지만 코딩을 시작하기 전에 다음 작업을 수행할 수 있는 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"
}

위의 장난감 구현은 전체 내용이 아닙니다. 유용한 정보가 전혀 없습니다.부동산 거래원자성과 같은 것. 그러나 파일 생성 및 이름 바꾸기와 같은 기본 파일 시스템 작업은 원자적이며 위 함수의 원자 버전을 구축할 수 있습니다.

이러한 직접 파일 시스템 구현은 소규모 데이터베이스(최대 수천 개의 파일)의 일반적인 파일 시스템에만 적합합니다. 그 외에도 대부분의 파일 시스템은 큰 디렉터리로 인해 어려움을 겪습니다. 계층적 레이아웃을 사용하여 이 구성표를 더 큰 데이터베이스에 적용할 수 있습니다. 예를 들어 모든 파일을 하나의 디렉터리에 저장하는 대신 파일 이름의 처음 몇 글자를 기준으로 별도의 하위 디렉터리에 저장합니다. 이게 뭐야?자식예를 들어, 해당 개체(SHA-1 해시로 색인화됨)는 .git/objects/01/2345679abcdef0123456789abcdef01234567.워플러그리고폴리보; 둘 다 URL에서 찾은 페이지의 캐시된 복사본을 라는 파일에 저장합니다. www.example.com/HASH여기서 HASH는 URL의 일부 해시 인코딩입니다.

비효율성의 또 다른 원인은 대부분의 파일 시스템이 작은 파일을 저장할 때 많은 공간을 낭비한다는 것입니다. 파일 크기에 관계없이 일반 파일 시스템에서는 파일당 최대 2kB까지 가능합니다.

실제 데이터베이스를 사용하기로 선택한 경우 투명한 파일 시스템 액세스의 편리함을 포기할 필요가 없습니다. 몇 개 있어요퓨즈파일 시스템데이터베이스에 접근하다Berkeley 데이터베이스를 포함합니다(Jeff Garzik의 dbfs), 오라클(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

관련 정보