Есть ли лучший способ хранить одно увеличенное целое число в БД потокобезопасным способом, чем блокировка?

Я разрабатываю приложение Sinatra, которое использует единорога. Каждый работник - это один поток, он загружает все приложение, они просто делят базу данных. (поправьте пожалуйста, если я ошибаюсь;))

Первый поток получает целое число, что-то делает с ним и затем увеличивает его, второй поток не должен получать целое число первого потока (безопасность потока), он должен получать только увеличенное целое число.

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

Если вы хотите увидеть все мое приложение, не стесняйтесь проверить его на github;)

1 ответ

Решение

Кажется, вы пытаетесь сгенерировать буквенно-цифровые идентификаторы для сокращенных URL-адресов. Если это так, то это намного проще, чем вы думаете

Пусть будет обычное поле с автоматическим приращением идентификатора. Когда поступает новый запрос, вы создаете запись в базе данных, получаете ее идентификатор (который больше не будет повторяться, и другие работники не получат его), конвертируете его в буквенно-цифровую форму и сохраняете (в другой столбец).

В некоторых случаях Ruby даже включает методы преобразования.

aid = 1746563

s = aid.to_s(36) # => "11fnn"
i = s.to_i(36) # => 1746563

Вы можете просто использовать свои методы вместо них.

Обновить

Поскольку вы упомянули, что используете Posgresql, для этого есть идеальный инструмент: последовательности!

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

Другие вопросы по тегам