2014-11-27 2 views
2

Мы пытаемся получить наши головы, обернутые вокруг вопроса дизайна, что на самом деле не так просто в любой БД. У нас есть 100 000 случайных предметов (может быть намного больше), (мы говорим по-настоящему случайным ключом, мы будем использовать UUID), и мы хотим раздавать их по одному. Заказ не важен. Мы думаем, что мы создадим таблицу динамо элементов, а затем удалим их из этой таблицы по мере их назначения. Мы можем сделать условное удаление, чтобы убедиться, что мы еще не дали этот элемент. Но, пытаясь найти элемент в первую очередь, если мы сделаем сканирование или запрос с лимитом в 1, будет ли он всегда попадать в ту же самую первую доступную запись? Мне интересно, что такое последствия. Динамо будет осколочно на UUID. Мы беспокоимся о том, что каждый сингл пытается попасть в одну и ту же запись все время. Сначала можно было бы удалить, тогда они могли бы нанести удар по второму и т. Д.Извлечение случайных одиночных предметов в Dynamo

Мы могли бы создать экземпляр memcache/redis в эластичном кеше и сохранить список доступных UUDS там. Мы можем сделать случайный выбор элементов из этого, используя redis SPOP, который получает случайный элемент и удаляет его. У нас может возникнуть проблема, когда мы можем выйти из синхронизации между ними, но по большей части это сработает.

Любые мысли о том, как сделать это без кеша, были бы замечательными. Если динамо выполняет сканирование, начиная с разных точек, это будет денди.

+0

Какова причина создания таблицы со всеми вашими присваиваемыми идентификаторами? Если вы используете UUIDs, их должна быть очень низкая вероятность дублирования, поэтому вместо условного удаления вы можете использовать условную запись? – mkobit

+0

Клиент хочет список идентификаторов раньше времени, так как им необходимо включить их с предложением продукта. – CargoMeister

+0

И условная запись, вероятно, будет работать. – CargoMeister

ответ

1

У меня такая же ситуация с вами, у вас есть набор миллионов UUID в качестве ключа в DynamoDB, и мне нужно случайным образом выбрать некоторые из них в вызове API. Для обеспечения производительности и простой реализации. Я использовал Redis, как вы сказали.

  1. добавить UUID в набор в Redis
  2. когда приходит вызов, SPOP на UUID из множества
  3. с этим UUID, дель в DynamoDB

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

+0

Tx, мы собираемся начать с только Динамо, а затем добавим Redis, как только увидим представление. – CargoMeister

+0

Кроме того, я не уверен, будет ли производительность сканирования плохим с пределом 1, поскольку она останавливается после первого чтения. Мы можем надеяться, что все будет хорошо. – CargoMeister

Смежные вопросы