Смысл использования универсальной блокировки в том, что у вас серьезные проблемы со многими пользователями, поскольку поток может быть заблокирован для каждого элемента кэша при запуске вашего приложения. Более того, каждый поток будет по-прежнему создавать свою собственную блокировку и запрос (и с 10 машинами и 32 потоками каждый, это 320 запросов!)
Мы используем такой подход (> 10 миллионов просмотров страниц в день и memcached):
При получении данных из базы данных мы сохраняем сообщение «в процессе» в аналогичном ключе кэша (например, добавляем in-progress
к ключу кэша или чему-то еще). Когда другой поток не может найти текущий элемент, он проверит ключ выполнения. Если элемент в процессе, подождите пару мс. и попробуйте получить снова. Если через несколько секунд (500 мс?) Снова выполнить действие базы данных из текущего потока, чтобы обезопасить себя от уничтожения приложения, когда элемент продолжает работать.
Таким образом, вы можете создать своего рода блокировку, но для нескольких машин и т. Д.
Без этого наш сервер CMS получит примерно 200 одинаковых запросов в течение первой секунды, поэтому нам действительно нужны блокировки для всего кластера.