Не знаю как будет на практике, но мне нравится идея с буфером)
Двумерная коллекция, где элемент коллекции:
Тип товара -> 100 свободных айдишников.
При пустом буфере первый пользователь подождёт заполнение буфера, последующие 99 будут быстро получать незанятый айдишник для данного товара, 101-ый пользователь ждёт сброс буфера в базу и заполнение нового буфера.
Допустим 10000 типов товаров, по 100 айдишников на каждый - 8 мегабайт памяти)
upd: Если uid используется для айдишников, то 16 МБ*