Slowpoke — Не Самая Быстрая База Данных

Всем привет. тугодум Это хранилище данных «ключ-значение», написанное в стандартной библиотеке 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.