Retrieving Random Single Items in Dynamo

2k views Asked by At

We are trying to get our heads wrapped around a design question, which is not really easy in any DB. We have 100,000 random items, (could be a lot more), (we are talking a truly random key, we'll use UUIDs,) and we want to hand them out one at a time. Order is not important. We are thinking that we'll create a dynamo table of the items, then delete them out of that table as they are assigned. We can do a conditional delete to make sure that we have not already given the item away. But, when trying to find an item in the first place, if we do a scan or a query with a limit of 1, will it always hit the same first available record? I'm wondering what the ramifications are. Dynamo will shard on the UUID. We are worried about everyhone trying to hit on the same record all the time. First one would of course get delete, then they could all hit on the second one, etc.

We could set up a memcache/redis instance in elastic cache, and keep a list of the available UUDS in there. We can do a random select of items from this using redis SPOP, which gets a random item and deletes it. We might have a problem where we could get out of sync between the two, but for the most part this would work.

Any thoughts on how to do this without the cache would be great. If dynamo does scans starting at different points, that would be dandy.

1

There are 1 answers

2
mingchuno On BEST ANSWER

I have the same situation with you that have a set of million of UUID as key in DynamoDB and I need to random select some of them in a API call. For the performance issue and easy implementation. I did use Redis as you said.

  1. add the UUID to a Set in Redis
  2. when the call comes, SPOP a UUID from the set
  3. with that UUID, del in DynamoDB

The performance of Scan operation is bad, should try to avoid it as best as you can.