Функция get_keys()
вызывает list_keys
в серверной части и считается дорогой операцией, поскольку выполняет полное сканирование пространства клавиш. В зависимости от вашего Riak-сервера это может также включать в себя полное сканирование данных, хранящихся на диске (вспоминается InnoStore). Бэкэнд по умолчанию (Bitcask) хранит все ваши ключи в памяти, поэтому производительность не должна быть такой большой проблемой.
Другая причина, по которой list_keys
считался дорогой, заключалась в том, что раньше это была блокирующая операция, так как она включала в себя то, что разработчики Basho называют «сворачиванием» всех ключей. list_keys
теперь использует снимок корзины (вместо чтения пространства живых клавиш), что также облегчает работу с весом.
Это стало проще с обновлением до Riak 1.0. Если вы используете серверную часть LevelDB, вы можете включить вторичные индексы в корзине и использовать индекс $key
(автоматически предоставленный Riak), чтобы получить список всех ключей в корзине.
Что касается того, почему Riak не поставляется с лучшей реализацией чего-то подобного: спросите, для чего эта функциональность. В СУБД получение всех первичных ключей таблицы включает в себя полное сканирование таблицы. В Riak получение всех ключей из корзины требует сканирования всех данных в каждом узле, а затем отправки имен ключей обратно в исходный узел, объединения этих данных и последующей отправки их вызывающему клиенту. Из-за распределенного, неупорядоченного состояния Riak эта операция дорогая, независимо от того, как вы ее нарезаете. Как я уже говорил выше, есть способы сделать его лучше.