INCR и DECR
Тема дорожной карты · Redis
INCR key атомарно увеличивает целочисленное значение, хранящееся в ключе Redis, на cq{1}, создавая ключ со значением 1, если он не существует. Аналогично, команда DECR key уменьшает значение на 1. Для использования произвольного шага изменения существуют команды INCRBY key increment и DECRBY key decrement. Эти команды позволяют эффективно управлять счётчиками и ограничителями скорости, а также генерировать последовательности без риска возникновения состояния гонки. Кроме того, INCRBYFLOAT key increment поддерживает дробные приращения, что полезно для накопления метрик или очков.
Счётчики Redis часто используются в сочетании с командой EXPIRE для реализации скользящего окна ограничения скорости. В этом случае ключ счётчика увеличивается при каждом запросе и автоматически истекает по завершении окна. Это позволяет эффективно ограничивать частоту запросов без необходимости использования сложных алгоритмов.
Как это работает
INCR и DECR — это простейший тип данных Redis: бинарно-безопасная последовательность байт до 512 МБ. Важными командами для работы с этими типами данных являются SET, GET, APPEND, STRLEN, GETRANGE, а также атомарные счётчики INCR и DECR. Команды SETEX и SETNX позволяют устанавливать значения с временем жизни и создавать распределённые блокировки соответственно. Команда EXPIRE или PEXPIRE используется для установления времени жизни ключа, а команда DEL автоматически удаляет ключ при истечении времени жизни.
Когда применять
Строки в Redis — это основной тип данных, который используется для кэширования JSON-ответов, создания атомарных счётчиков, управления простыми фич-флагами, хранения сессионных идентификаторов и ограничителей скорости. Команды SET ... EX ... NX позволяют безопасно устанавливать значения с временем жизни и создавать распределённые блокировки. Команды SETBIT и GETBIT используются для работы с битовыми картами, что полезно для управления фич-флагами и подсчёта уникальных значений.
Типичные ошибки
Основные ловушки при использовании команд INCR и DECR включают хранение больших JSON-блоков как Redis-строк, что приводит к увеличению сетевого трафика и потребления оперативной памяти. Также стоит избегать использования временных ключей с динамически изменяющимся временем жизни, поскольку это может привести к дрейфу значений. В Redis Cluster использование SETNX для создания блокировок может привести к непредсказуемому поведению, поэтому рекомендуется использовать методы, такие как Redlock или single-master.