Redis · Redis 7.4.11
В Авито выдача поиска кэшируется в Redis: ключ строится из запроса, при промахе сервис идёт в Sphinx и кладёт ответ в кэш. Даже в тихие часы это больше 50 тыс. чтений в секунду.
Ключ выдачи «iPhone 15 в Москве, страница 1» — search:msk:iphone15:p1, значение — список id объявлений. Воркер посчитал выдачу ids:101,205,317. Если в кэше уже лежит выдача, которую положил соседний воркер, её нельзя ни перезаписывать, ни продлевать: запись живёт 300 секунд с момента появления.
Последняя команда во всех вариантах — TTL search:msk:iphone15:p1: по ней видно, сколько проживёт запись.
В работе: Кэш перед медленным источником: поиск, рекомендации, ответы внешних API.
Источник: кейс Авито: Redis как кэш поиска перед Sphinx, Хабр, 2025. Условие пересказано своими словами.
Какая последовательность положит выдачу только в пустой кэш и не продлит существующую запись?
- SET … NX EX 300
- SET … EX 300 без NX
- SETNX, затем EXPIRE
- Только SETNX
- SET … XX EX 300