Pull to refresh

Comments 2

норм аналогия. а нашествие кэша как победили? сеидмьютексом или как-то хитрее?

Хитрости не потребовалось. У меня кэшируется живая статистика, и там обычный sync.RWMutex с double-checked locking: горячий путь под RLock, на промахе берём Lock и перепроверяем условие внутри. Без этой перепроверки десять горутин, упёршихся в истёкший TTL, сходят в базу десять раз вместо одного.

singleflight тут избыточен: он дедуплицирует по ключу и окупается, когда ключей много. У меня ключ один.

Слабое место: пока держится Lock, читатели ждут вместе с ним. Запрос долгий - встали все. Вот тут singleflight мягче, а stale-while-revalidate ещё мягче.

И от нескольких инстансов мьютекс не спасает вообще: каждый сходит в базу сам. Если за кэшем что-то дорогое, нужен SET NX.

А у вас как?

Sign up to leave a comment.

Articles