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

255. MGET сессии и координат водителя после переезда в кластер

Средняя

Redis · Redis 7.4

В 2020 году Ситимобил переводил одиночный Redis на Redis Cluster. Сервисы кэша, сессий и координат водителей были написаны под один инстанс: MGET и MSET по нескольким ключам, SELECT для отдельной базы, SCAN по всем ключам.

В кластере ключи распределены по 16384 слотам, слоты — по нодам. Сервис водителей одной командой читает сессию и последнюю точку водителя: MGET driver:42:session driver:42:geo. В кластере команда возвращает ошибку CROSSSLOT.

Водителей сотни тысяч, сервис дёргает эти ключи на каждом шаге поездки. Нужно переименовать ключи так, чтобы MGET и MULTI по ключам одного водителя работали, а нагрузка расходилась по всем нодам.

В работе: Миграция кода с одиночного Redis на кластер: сессии, корзины, профили, любые ключи, которые читают пачкой.

Как проверяем Движка Redis в браузере пока нет, поэтому здесь не запрос, а выбор решения. Выберите один вариант. После ответа — почему каждый вариант верный или нет. Ответ один на подход: после него показываем разбор.
Redis Clusterhash slothash tagCROSSSLOTмодель ключей

Источник: кейс Ситимобила: переезд с одиночного Redis на Redis Cluster, 2020. Условие пересказано своими словами.

Какая схема ключей вернёт MGET по одному водителю и не перегрузит одну ноду?

  • Hash tag по id водителя: driver:{42}:session и driver:{42}:geo
  • Общий тег на всех: drivers:{all}:42:session
  • Отдельная база: SELECT 1 для данных водителей
  • Обернуть два GET в MULTI/EXEC
  • Увеличить число слотов, чтобы ключи разъехались лучше