Получить данные из мнезии в порядке вставки
Я новичок в Elixir и работаю над распределенной системой. Эта система имеет несколько глобальных таблиц. Записи в эти таблицы часты, поэтому они должны выполняться довольно быстро. Теперь мне иногда приходится обрабатывать одну целую таблицу и генерировать из нее некоторый JSON, но мне нужно обрабатывать записи в этой таблице в порядке их добавления в базу данных. (Мне не нужны какие-либо жесткие гарантии. Нечастые ошибки, такие как две поменявшиеся записи или даже одна пропущенная, допустимы.)
К сожалению, у mnesia afaik нет ничего похожего на SQL auto_increment
и теперь я изо всех сил пытаюсь реализовать эту функциональность самостоятельно.
Решение, которое я могу придумать:
-
Сохраните метку времени Unix (или другую метку времени) в качестве ключа для записей.Но мне кажется неправильным, что правильность программы зависит от времени.Ситуация, когда время на двух машинах не синхронизировано, было бы ужасно отлаживать.И поиск времени идет очень медленно (прочитайте его где-нибудь, пожалуйста, поправьте меня, если я ошибаюсь)Единица меток времени Unix - это секунда, которая слишком велика. - Храните глобальный счетчик, поскольку они ключ для записей. Может быть даже медленнее, чем отметка времени, и я не уверен, что возиться со счетчиками мнезии - хорошая идея, так как они не подходят для распределенных систем (опять же, пожалуйста, исправьте меня, если я ошибаюсь)
- Найдите волшебный способ поддерживать порядок, в котором были вставлены записи. Это мой любимый;)
1 ответ
Если вы хотите реализовать это самостоятельно, то, как упомянул @Aleksei, dirty_update_counter/3
это путь
Но если вы в порядке с использованием внешней библиотеки, оба Memento
а также Amnesia
Поддержка пользовательской реализации автоинкремента. Вот как это будет выглядеть в Memento:
defmodule MyTable do
use Memento.Table,
attributes: [:id, :title, :content, :status, :author],
type: :ordered_set,
autoincrement: true
end
Кроме того, Mnesia имеет модель конечной согласованности, поэтому, несмотря на то, что она очень быстрая, она не дает мгновенных гарантий согласованности. Какую бы реализацию вы ни выбрали для автоинкремента, это определенно скажется на производительности.
Полное раскрытие: я автор Memento