Есть ли лучший способ хранить одно увеличенное целое число в БД потокобезопасным способом, чем блокировка?
Я разрабатываю приложение Sinatra, которое использует единорога. Каждый работник - это один поток, он загружает все приложение, они просто делят базу данных. (поправьте пожалуйста, если я ошибаюсь;))
Первый поток получает целое число, что-то делает с ним и затем увеличивает его, второй поток не должен получать целое число первого потока (безопасность потока), он должен получать только увеличенное целое число.
Я сделал это с блокировкой, но хочу найти лучший подход, потому что во время своего исследования я часто читал, что это очень плохой способ решения моей проблемы, поскольку он не очень масштабируем.
Если вы хотите увидеть все мое приложение, не стесняйтесь проверить его на github;)
1 ответ
Кажется, вы пытаетесь сгенерировать буквенно-цифровые идентификаторы для сокращенных URL-адресов. Если это так, то это намного проще, чем вы думаете
Пусть будет обычное поле с автоматическим приращением идентификатора. Когда поступает новый запрос, вы создаете запись в базе данных, получаете ее идентификатор (который больше не будет повторяться, и другие работники не получат его), конвертируете его в буквенно-цифровую форму и сохраняете (в другой столбец).
В некоторых случаях Ruby даже включает методы преобразования.
aid = 1746563
s = aid.to_s(36) # => "11fnn"
i = s.to_i(36) # => 1746563
Вы можете просто использовать свои методы вместо них.
Обновить
Поскольку вы упомянули, что используете Posgresql, для этого есть идеальный инструмент: последовательности!
Вы можете создать последовательность, а затем получить из нее автоматически увеличивающиеся числа, не беспокоясь о том, что другой клиент получит то же значение.