Unix için standart anahtar / değer veri deposu


16

Unix için anahtar / değer kitaplıklarını biliyorum ( Berkeleydb , gdbm , redis ...). Ancak kodlamaya başlamadan önce, unix için aşağıdaki işlemleri yapmama izin verecek standart bir araç olup olmadığını merak ediyorum:

$ 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...

Teşekkürler

Yanıtlar:


10

Bunun için standart bir araç olduğunu düşünmüyorum. grep/ awk/ sedVb. Hariç . Ancak bunu kullanarak kilitleme, biçim, özel karakterler vb. Gibi diğer birçok konuya dikkat etmeniz gerekir.

Ben kullanmanızı öneririm sqlite. Basit bir tablo tanımlayın ve ardından işlevler oluşturun tool_get()ve tool_put()kabukları ekleyin. sqlitetaşınabilir, hızlı.

Ücretsiz olarak ekstra esneklik elde edersiniz. Komut dosyanızı tanımlamak için kısıtlamalar tanımlayabilir, dizine ekleyebilir veya bir gün o DB'yi diğer dillerde kullanabilirsiniz.


Teşekkür ederim . Hızlı bir şekilde sqlite API ile bir araç yazdım. İyi çalışıyor.
Pierre

9

Veritabanınız yeterince küçükse, dosya sistemini kullanabilirsiniz. Bu yaklaşımın avantajı, çok düşük teknolojili olması ve her yerde çok az kodla çalışmasıdır. Anahtarlar yazdırılabilir karakterlerden oluşuyorsa ve içermiyorsa /, bunları dosya adları olarak kullanabilirsiniz:

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

İsteğe bağlı anahtarları yerleştirmek için, dosya adı olarak anahtarın bir sağlama toplamı kullanın ve isteğe bağlı olarak anahtarın bir kopyasını saklayın (anahtarları listelemekten veya belirli bir giriş için anahtarın ne olduğunu söylemekten memnun değilseniz).

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

Yukarıdaki oyuncak uygulamalarının tüm hikaye olmadığını unutmayın: atomiklik gibi herhangi bir yararlı işlem özelliği yoktur . Bununla birlikte, dosya oluşturma ve yeniden adlandırma gibi temel dosya sistemi işlemleri atomiktir ve yukarıdaki işlevlerin atomik sürümlerini oluşturmak mümkündür.

Bu dosya sistemine doğrudan uygulamalar, yalnızca küçük veritabanları için, birkaç bin dosyaya kadar olan tipik dosya sistemleri için uygundur. Bu noktanın ötesinde, çoğu dosya sistemi büyük dizinlerle baş etmekte zorlanır. Katmanlı bir düzen kullanarak şemayı daha büyük veritabanlarına uyarlayabilirsiniz. Örneğin, tüm dosyaları tek bir dizinde saklamak yerine, adlarının ilk birkaç karakterine göre ayrı alt dizinlerde saklayın. Bu nedir git SHA-1 sağlamalarının tarafından dizine onun nesneler, denilen dosyalarında saklanır: örneğin, yapar .git/objects/01/2345679abcdef0123456789abcdef01234567. Bir semantik katmanlarını kullanan programlar diğer örnekleri proxy önbelleğe web olan Wwwoffle ve Polipo ; her ikisi de bir URL'de bulunan sayfanın önbelleğe alınmış kopyasını adlı bir dosyada saklarwww.example.com/HASH burada HASH, URL'nin bazı karma değerlerini kodlamaktadır.

Bir başka verimsizlik kaynağı, çoğu dosya sisteminin küçük dosyaları depolarken çok fazla yer kaplamasıdır - dosya boyutundan bağımsız olarak tipik dosya sistemlerinde dosya başına 2kB'a kadar atık vardır.

Gerçek bir veritabanıyla gitmeyi seçerseniz, şeffaf dosya sistemi erişiminin rahatlığından vazgeçmeniz gerekmez. Berkeley DB ( Jeff Garzik's dbfs ile ), Oracle ( Oracle DBFS ile ), MySQL ( mysqlfs ile ), vb. Veritabanlarına erişmek için birkaç FUSE dosya sistemi vardır .

¹ gibi bir URL için http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unix, Polipo dosyası kullanır unix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==açık metin olarak gerçek bir URL gösteren dosyası içinde ilave bir başlık ile; dosya adı, URL'nin MD5 karmasının (ikili olarak) base64 kodlamasıdır. Wwwoffle dosyayı kullanır http/unix.stackexchange.com/DM0pPbpRufiErf4DLFcWlhw; dosyanın adı, MD5 karmasının evde oluşturulmuş bir kodlamasıdır ve tamamlayıcı bir dosya http/unix.stackexchange.com/UM0pPbpRufiErf4DLFcWlhwURL'yi içerir.


7

dbmutilsize istediğinizi sağlayabilir. Soruda açıkladığınız işlemler için kabuk yardımcı programlarına sahiptir. Tam olarak standart olduğunu söyleyemem, ama istediğiniz olanaklara sahip.


5

Adını belirttiğiniz için, standart redis istemcisinin bir komut satırı arabirimi vardır redis-cli. Bazı örnekler redis-cli -h:

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

(Ve dosya sistemi üzerinden db erişmek istiyorsanız ile soketleri kullanabilirsiniz -s. Her çağırmada doğrudan db dizin okuyacak bir araç çok verimsiz olurdu.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.