Switch lang: Русский \ English

A_Storage - Sorted Map Structure

Sorted Map

Sorted Map - Функциональность похожа по "data model" на Cassandra. Предназачена для хранения последовательностей в кластере.

Основные преимущества структуры:

  • + В ключах есть порядок. Можно итерировать ключи и запрашивать range
  • + Скорость работы равна скорости Key-Vavlue.

Подходит для индексирования (reverse index) большого объёма данных, (индекс должен целиком поместиться на одну машину)

Доступные методы

CreateTransaction(isolationLevel) -> transactionID

Создание транзакции с указанным уровнем изоляции. Возвращает идентификатор транзакции, с которым нужно выполнять все остальные запросы, в них он опущен. Так же не указываются NRW параметры, чтобы не увеличивать сигнатуру методов.

Get(partition, clustering) -> (value, version)

Получение значения одного ключа. clustering-ключ может быть пустым. В зависимости от уровня изоляции при выполнении этого запроса может установиться блокировка на clustering-ключ или на весь partition. Внутри транзакции полученная версия значения может не совпадать с версией вне транзакции или в другой транзакции.

Set(partition, clustering, value) -> (version)

Установка значения одного ключа. Обеспечивает отсутствие потерянных обновлений между транзакциями. Внутри одной транзакции может быть перезатёрто set’ом выполненным параллельно. Возвращает новую версию.

Сas(partition, clustering, value, version) -> (version)

Установка значения, если указанная версия совпадает с текущей. Обеспечивает как отсутствие потерянных обновлений между транзакциями, так и возможность параллельной атомарной работы со значением внутри одной транзакции. Если cas прошёл успешно - возвращает новую версию, иначе - текущую версию.

Range(partition, first, last, limit) -> SortedMap

entry = (value, version)

Выборка clustering-ключей из одного partition-ключа с указанными ограничениями. Выборка идёт от ключа first до ключа last, максимальное количество элементов в выборке - limit. Метод возвращает словарь выбранных clustering-ключей и их значений. Batch(partition, Map) -> SortedMap

Батч-запрос get, set, cas методов.

entry = (value, version)
  • Если указано значение - выполняется set.
  • Если указано значение и версия - cas.
  • Если в entry ничего не указано, то выполняется get.

Версионирование

Версии каждого ключа внутри одной транзакции начинаются с нуля. Они никак не связаны с реальными версиями ключей за пределами транзакций и с версиями в других транзакциях. В уровне READ COMMITTED могут возвращаться разные значения с нулевой версией, так как при чтении они не кэшируются.

Уровни изоляции

  • READ UNCOMMITTED. Реализовывать этот уровень смысла нет, потому что алгоритм транзакций уже его предотвращает.
  • READ COMMITTED. Самый низкий уровень изоляции в KV. Обеспечивает чтение только закоммиченных данных. При этом повторные чтения одного ключа могут возвращать разные данные. Одна и та же выборка внутри партишена может возвращать разное количество ключей. Записи транзакции не видны для остальных, пока не будет произведен коммит.
  • REPEATABLE READ. Устраняется возможность чтения разных данных по одному ключу.
  • SERIALIZABLE. Устраняется возможность чтения разных ключей по одной и той же выборке.

Comments

Comments powered by Disqus
Skip to main content