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