Хитрости не потребовалось. У меня кэшируется живая статистика, и там обычный sync.RWMutex с double-checked locking: горячий путь под RLock, на промахе берём Lock и перепроверяем условие внутри. Без этой перепроверки десять горутин, упёршихся в истёкший TTL, сходят в базу десять раз вместо одного.
singleflight тут избыточен: он дедуплицирует по ключу и окупается, когда ключей много. У меня ключ один.
Слабое место: пока держится Lock, читатели ждут вместе с ним. Запрос долгий - встали все. Вот тут singleflight мягче, а stale-while-revalidate ещё мягче.
И от нескольких инстансов мьютекс не спасает вообще: каждый сходит в базу сам. Если за кэшем что-то дорогое, нужен SET NX.
А у вас как?
Информация
В рейтинге
1 289-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность
Специализация
Бэкенд разработчик, Архитектор программного обеспечения
Хитрости не потребовалось. У меня кэшируется живая статистика, и там обычный
sync.RWMutexс double-checked locking: горячий путь подRLock, на промахе берёмLockи перепроверяем условие внутри. Без этой перепроверки десять горутин, упёршихся в истёкший TTL, сходят в базу десять раз вместо одного.singleflightтут избыточен: он дедуплицирует по ключу и окупается, когда ключей много. У меня ключ один.Слабое место: пока держится
Lock, читатели ждут вместе с ним. Запрос долгий - встали все. Вот тут singleflight мягче, а stale-while-revalidate ещё мягче.И от нескольких инстансов мьютекс не спасает вообще: каждый сходит в базу сам. Если за кэшем что-то дорогое, нужен
SET NX.А у вас как?