Войти Регистрация
Data base

139. Кэш поисковой выдачи: не продлить старое

Средняя

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 в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
строкиSET NX EXTTLкэш

Источник: кейс Авито: Redis как кэш поиска перед Sphinx, Хабр, 2025. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.

Какая последовательность положит выдачу только в пустой кэш и не продлит существующую запись?

  • SET … NX EX 300
  • SET … EX 300 без NX
  • SETNX, затем EXPIRE
  • Только SETNX
  • SET … XX EX 300