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.
- Выполнять инкремент битовой карты постепенно с помощью необязательных параметров
BITCOUNTstart и 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/