Стандартний сховище даних ключів / значень для unix


16

Я знаю про бібліотеки ключів / значень для unix ( berkeleydb , gdbm , redis ...). Але перш ніж почати кодування, мені цікаво, чи існує стандартний інструмент для 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портативний, швидкий.

Ви отримаєте додаткову гнучкість безкоштовно. Ви можете визначити обмеження, індексувати, щоб налаштувати свій скрипт або використовувати цей БД в інших мовах якогось дня.


Дякую . Я швидко написав інструмент за допомогою API sqlite. Це чудово працює.
П’єр

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. Іншими прикладами програм, які використовують семантичне шарування, є веб-проксі-кешування Wwwoffle та polipo ; обидва зберігають кешовану копію сторінки, знайденої за URL-адресою у файлі, який називаєтьсяwww.example.com/HASH де HASH - це кодування деякого хешу URL.¹

Іншим джерелом неефективності є те, що більшість файлових систем витрачають багато місця під час зберігання невеликих файлів - витрачається до 2 КБ на файл на типових файлових системах, незалежно від розміру файлу.

Якщо ви вирішили користуватися реальною базою даних, вам не потрібно відмовлятися від зручності доступу до прозорої файлової системи. Існує декілька файлових систем FUSE для доступу до баз даних, включаючи Берклі DB (з dbfs Джеффа Гарзіка ), Oracle (з DBFS Oracle ), MySQL (з mysqlfs ) тощо.

¹ для такої URL-адреси, як http://unix.stackexchange.com/questions/21943/standard-key-value-datastore-for-unixPolipo використовує файл unix.stackexchange.com/M0pPbpRufiErf4DLFcWlhw==із доданим заголовком всередині файлу, який чітко вказує фактичну URL-адресу; ім'я файлу - базове64, що кодує хеш MD5 (у двійковій формі) URL-адреси. 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-індекс безпосередньо на кожному виклику, буде дуже неефективним.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.