Как это сделано у Redis,
алгоритм Redlock:
- понадобится доп. поле для случайной строки;
- генерите случайный ID и случайное значение;
- вставляете в таблицу запись с этим ID и значением. БД не позволит вставить, если уже есть такой ID.
- Читаете эту запись и её доп.поле. Если считанное доп.значение совпало с вашим сгенеренным случайным значением – всё круто, этот ID ваш, можно его использовать;
- Если считалось, но там другое значение доп. поля – придётся снова генерить новый случайный ID и сл. значение ему в пару – до тех пор, пока не попадёте пальцем в небо. Чем больше тикетов в системе, тем дольше может понадобиться погадать. И скорее переписать всю ущербную систему на последовательную нумерацию записей и генерацию не выглядящих последовательными биьективных трансформаций из них (самое простое – инверсия порядка битов).
Upd. подробнее об идее с перемешиванием битов последовательных ID, чтобы они выглядели непоследовательно. Самый простой вариант однозначного соответствия между двумя множествами это инверсия порядка битов. В БД храните последовательные возрастающие ID. Тип INT в MySQL занимает
4 байта, это 32 бита. Для отображения их клиенту вы в PHP или NodeJS (они все 64-битные) инвертируете порядок бит в младших 4 байтах. Например:
было 199
00000000 00000000 00000000 11000111
стало (зеркально)
11100011 00000000 00000000 00000000
это 64-битное число 3808428032
было 200
00000000 00000000 00000000 11001000
стало
00010011 00000000 00000000 00000000 (318767104)
Такое зеркалирование порядка – операция обратимая. Дважды отзеркалить – будет исходное. Поэтому клиентам показываете эти сложные номера, у себя ведёте последовательные упорядоченные ID.
Код для реверса порядка бит на JS и PHP я уверен, вы напишете самостоятельно. Подскажу, что для увеличения скорости операции удобно использовать небольшую
таблицу байтов 16x16.