Всем привет. тугодум Это хранилище данных «ключ-значение», написанное в стандартной библиотеке golang. Slowpoke имеет минималистичный, удобный API и подходит для решения достаточно широкого круга задач.
Вы можете записать значение в Slowpoke с помощью команды Set:
Единицей хранения данных в слоупоке является файл.slowpoke.Set("db/some.db", []byte("foo"), []byte("bar"))
В этом примере будет создан каталог «db» с файлом «some.db», в котором будут размещены три байта («бар»).
Строго говоря, каждый файл в Slowpoke представляет собой независимую базу данных.
Каждая база данных поддерживается в отдельной горутине.
Файл открывается/читается автоматически.
Те.
если эта база данных существует, она будет открыта и прочитана.
Если нет, то он создан.
Эта возможность позволяет не думать о состоянии базы данных при работе с ней и может использоваться, например, в обработчиках http-запросов или в других горутинах.
Slowpoke принимает массив байтов в качестве ключа и значения.
В приведенном выше примере строки по существу используются в качестве ключа и значения.
Запишем цифры в слоупоке: for i := 0; i < 40; i++ {
id := make([]byte, 4)
binary.BigEndian.PutUint32(id, uint32(i))
slowpoke.Set("numeric.db", id, nil)
}
Мы преобразовали числа в формат BigEndian, что позволит нам корректно учесть сортировку ключей в дальнейшей работе.
Значение в этом примере не указано, будет создан только массив ключей (размер numeric.db будет равен 0 байт).
Говоря о ключах, ключи в слоупоке хранятся в памяти, но сохраняются на диске.
Это позволяет быстро работать с ключами с одной стороны и закрывать таблицу в случае нехватки оперативной памяти с другой.
По этой причине не рекомендуется использовать большие ключи.
Я предполагаю, что оптимальный суммарный размер всех ключей одной таблицы составит 10 Мегабайт. Если этот размер превышен, лучше разделить базу данных на несколько таблиц.
Значения не сохраняются в памяти и могут быть любого размера (картинки, фильмы).
Общий размер таблицы значений не может превышать uint32. Некоторые преимущества такого подхода (раздельное хранение ключей и значений) описаны в статье.
www.usenix.org/system/files/conference/fast16/fast16-papers-lu.pdf (в этой статье упор делается на Lsm Tree ssd накопители и прочие архитектурные изыски, не используемые в слоупоке) Вернемся к слоупоку.
Помимо чисел, строк, файлов и т. д., вы также можете сохранять объекты, сериализовав их одним из методов.
Пример сериализации в json:
binary, _ := json.Marshal(post)
slowpoke.Set("json",key,binary)
Или используйте пакет gob, встроенный в golang: golang.org/pkg/encoding/gob
Все команды записи в Slowpoke являются атомарными и завершаются командой sync (синхронизация данных).
Дело в том, что современные файловые системы при записи в файл по сути пишут в буфер.
А если операционная система выйдет из строя, буфер будет потерян.
У большинства баз данных есть режим nosync (его можно называть по-разному, но дело в том, что операция синхронизации происходит очень медленно, особенно это заметно на старых жестких дисках, и этот режим используется для победы в бенчмарках и ускорения записи).
Хороший обзор на тему уязвимости к сбою.
В Slowpoke нет режима «nosync», поэтому: Чтобы вставить несколько записей в Slowpoke, используйте команду Sets. Эту команду рекомендуется использовать для написания пакета «ключ-значение».
В этом случае данные будут записаны в файловый буфер и синхронизированы только один раз, по завершении записи.
Это резко увеличивает скорость записи, с одной стороны, и позволяет не жертвовать сохранностью данных в целом, с другой стороны.
Пример использования команды Sets: var pairs [][]byte
Теги: #golang #ключ-значение #база данных #Go
-
Стоимость Смены Ip Онлайн
19 Oct, 24 -
Лемносский Язык
19 Oct, 24 -
Плати Налоги — Спи Спокойно
19 Oct, 24 -
Как Выбрать Инструмент Статического Анализа
19 Oct, 24 -
Google Запускает Поиск По Исходному Коду
19 Oct, 24