Go: BoltDBBoltDB — это простое встраиваемое хранилище, построенное по принципу ключ/значение, полностью написанное на языке программирования Go, что в значительной степени упрощает его поддержку. Изначально целью проекта было создать простое, быстрое и надежное хранилище, которое может быть использовано в проектах, которые не требуют полноценного сервера базы данных такого как PostgreSQL или MySQL. BoltDB для хранения данных использует один файл, который блокируется на время использования приложением. При этом файл данных может спокойно достигать размера в 1 ТБ. В качестве структуры хранения данных используется B+дерево. Поэтому BoltDB быстрее чем RocksDB/LevelDB (построенных на основе LSM-деревьем) в случае чтения, но значительно медленнее, когда дело касается большого количества операций записи. Для начала работы с хранилищем установим библиотеку командой:
Для начала работы приложение должно открыть хранилище BoltDB
В коде выше открывается хранилище my.db, ему выставляются права доступа 0600. Если файл хранилища не существует, то он будет создан. Важным моментом является то, что только одно приложение может работать с файлом хранилища, поэтому для избежания deadlock-а можно задать время, ожидания хранилища
BoltDB поддерживает транзакции. Одновременно может выполнятся одна read-write транзакция и несколько read-only транзакций. Read/write транзакция инициализируется при помощи функции db.Update следующим образом:
Read only транзакция инициализируется при помощи db.View, как показано ниже:
Разработчики рекомендуют работать с транзакциями через вызовы db.View/db.Update. Но бывают ситуации, когда нужно управлять транзакцией вручную, это тоже возможно:
BoltDB хранит все данные в коллекциях (Bucket), каждая из которых представляет собой множество ключ/значение. Важно отметить, что в разных коллекциях могут быть одинаковые ключи, которые имеют разные значения. Для созданий коллекции используется метод CreateBucket или CreateBuckerIfNotExists. Пример создания коллекции ниже:
Для удаления коллекции существует метод Tx.DeleteBucket(), а для получения существующей Tx.Bucket:
Как говорилось выше, все ключи хранятся в коллекция, поэтому доступ к значениям ключей также осуществляется через них, что видно из примера выше (b.Get). Если в коллекции такого ключа нет, то возвращается значение nil. Для добавления ключа в коллекцию используется метод Put:
Исходя из того, что данные хранятся в B+дереве, все ключи отсортированы, поэтому последовательный проход по всем значениям нересурсоемкая операция. Для этого используются курсоры, которые позволяют переходить на первый элемент (First), последний (Last), на указанное значение (Seek), предыдущее (Prev) и следующее за текущим (Next). Ниже приведен пример прохода по всем ключам коллекции:
Немного адаптировав предыдущий пример при помощи метода Seek и пакета bytes, можно извлечь все ключи начинающиеся с заданного префикса:
Путем замены метода bytes.HasPrefix на bytes.Compare можно организовать вывод всех ключей в диапазоне от min до max:
Для прохода по всем ключам и значениям в рамках конкретной коллекции вы можете воспользоваться методов ForEach:
За более подробной информацией можете обратиться к официальному руководству.
15.03.2018 |
популярные тэги
наука
новости
go
golang
технологии
искусственный интеллект
программирование
ai
базы данных
it
science
космос
анализ текстов
медицина
text mining
ии
история
интересно
интернет
нейронные сети
робототехника
роботы
robots
postgresql
space
авто
алгоритмы
nosql
здоровье
google
фото
генетика
игры
auto
databases
internet
yandex
безопасность
лингвистика
музыка
|