유닉스를위한 표준 키 / 값 데이터 저장소


16

유닉스 용 키 / 값 라이브러리 ( berkeleydb , gdbm , redis ...) 에 대해 알고 있습니다. 그러나 코딩을 시작하기 전에 다음 작업을 수행 할 수있는 유닉스 용 표준 도구가 있는지 궁금합니다.

$ 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를 사용하여 도구를 빠르게 작성했습니다. 잘 작동합니다.
Pierre

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"
}

위의 완구 구현은 전체 이야기가 아닙니다 . 원자 성과 같은 유용한 거래 속성 이 없습니다 . 그러나 파일 생성 및 이름 바꾸기와 같은 기본 파일 시스템 작업은 원 자성이며 ​​위 기능의 원자 버전을 작성할 수 있습니다.

이러한 직접 파일 시스템 구현은 최대 수천 개의 파일까지 작은 데이터베이스에만 일반적인 파일 시스템에 적합합니다. 이 시점을 넘어서서 대부분의 파일 시스템은 큰 디렉토리에 대처하는 데 어려움을 겪고 있습니다. 계층 레이아웃을 사용하여 스키마를 더 큰 데이터베이스에 적용 할 수 있습니다. 예를 들어, 모든 파일을 하나의 디렉토리에 저장하는 대신 이름의 처음 몇 문자를 기준으로 별도의 하위 디렉토리에 저장하십시오. 이것은 git이하 는 일입니다. 예를 들어 SHA-1 해시에 의해 인덱스 된 객체는라는 파일에 저장됩니다 .git/objects/01/2345679abcdef0123456789abcdef01234567. 시맨틱 계층을 사용하는 프로그램의 다른 예는 웹 캐싱 프록시 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 해시 (2 진)의 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.