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
программирование
it
искусственный интеллект
путешествия
природа
космос
ai
базы данных
медицина
science
анализ текстов
ии
text mining
робототехника
авто
музыка
роботы
интернет
нейронные сети
robots
space
вокруг света
postgresql
алгоритмы
гитара
животные
оружие
google
nosql
авиация
здоровье
техника
auto
|