Spec-Zone.ru › Redis

BITCOUNT

BITCOUNT
Синтаксис
BITCOUNT key [start end [BYTE | BIT]]
Доступно с версии:
2.6.0
Сложность по времени:
O(N)
Категории ACL:
@read, @bitmap, @slow,

Подсчитывает количество установленных битов (подсчёт популяции) в строке.

По умолчанию проверяются все байты, содержащиеся в строке. Возможна выборка операций подсчета только в заданном интервале, передавая дополнительные аргументы start и end.

Как и для команды GETRANGE, аргументы start и end могут принимать отрицательные значения для индексации байтов с конца строки, где -1 — последний байт, -2 — предпоследний и так далее.

Несуществующие ключи обрабатываются как пустые строки, поэтому команда вернёт ноль.

По умолчанию дополнительные аргументы start и end задают индекс байта. Мы можем использовать дополнительный аргумент BIT для задания индекса бита. Таким образом, 0 — первый бит, 1 — второй бит и так далее. Для отрицательных значений, -1 — последний бит, -2 — предпоследний и так далее.

Возврат

Целочисленный ответ

Количество битов, установленных в 1.

Примеры

SET mykey "foobar"
BITCOUNT mykey
BITCOUNT mykey 0 0
BITCOUNT mykey 1 1
BITCOUNT mykey 1 1 BYTE
BITCOUNT mykey 5 30 BIT

Шаблон: метрики в реальном времени с использованием битовых карт

Битовые карты — очень экономичное представление определённых видов информации. Один пример — веб-приложение, которому нужна история посещений пользователей, чтобы, например, определить, какие пользователи являются хорошими кандидатами для бета-функций.

Используя команду SETBIT, это легко реализовать, идентифицируя каждый день небольшим нарастающим целым числом. Например, день 0 — первый день запуска приложения, день 1 — следующий день и так далее.

Каждый раз, когда пользователь просматривает страницу, приложение может зарегистрировать это в текущий день, используя команду SETBIT, устанавливая бит, соответствующий текущему дню.

Позже будет легко узнать количество отдельных дней, в которые пользователь посещал веб-сайт, просто вызвав команду BITCOUNT для битовой карты.

Аналогичный шаблон, где используются идентификаторы пользователей вместо дней, описан в статье под названием "Быстрые простые метрики в реальном времени с использованием битовых карт Redis".

Соображения по производительности

В приведенном выше примере подсчета дней, даже через 10 лет после запуска приложения, у нас по-прежнему есть всего 365*10 бит данных на пользователя, то есть всего 456 байт на пользователя. С таким объёмом данных BITCOUNT остаётся столь же быстрой, как и любая другая команда Redis с O(1), например, GET или INCR.

Когда битовая карта большая, есть два варианта:

  • Использовать отдельный ключ, который инкрементируется каждый раз, когда битовая карта изменяется. Это может быть очень эффективным и атомарным с помощью небольшого скрипта Lua Redis.
  • Выполнять инкремент битовой карты постепенно с помощью необязательных параметров BITCOUNT start и end, накапливая результаты на стороне клиента, и, при необходимости, кэшируя результат в ключе.

История

  • Начиная с версии Redis 7.0.0: Добавлен параметр BYTE|BIT.

© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/bitcount/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API