데이터베이스가 충분히 작 으면 파일 시스템을 사용할 수 있습니다. 이 방법의 장점은 기술이 매우 낮고 코드가 거의 없어도 어느 곳에서나 작동한다는 것입니다. 키가 인쇄 가능한 문자로 구성되고를 포함하지 않는 경우 /
파일 이름으로 사용할 수 있습니다.
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
. 시맨틱 계층을 사용하는 프로그램의 다른 예는 웹 캐싱 프록시 Wwwoffle 및 polipo입니다 . 둘 다 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이 포함됩니다.