Redis Jingjin - Играй и играй, создавай проблемы, не высмеивай Bitmap

Redis
Redis Jingjin - Играй и играй, создавай проблемы, не высмеивай Bitmap

Как перед просмотром, разрабатывать привычку ❤️

Что такое растровое изображение

  • 8 бит образуют байт, поэтому растровое изображение значительно экономит место на диске.
    Вы можете думать об этом как о специально обработанной строке
  • key представляет бизнес-атрибуты и метки. Бит для представления значения или состояния элемента.
    Например: регистрировать ежедневных активных пользователей, ключ представляет登录时间, 1, 2, 3... представляют идентификатор пользователя
key 0 1 2 3 4 5 6 7
login20191230 0 0 1 0 0 0 0 0
login20191231 0 1 0 0 1 0 0 0
login20200101 0 0 1 0 0 0 0 0

Тогда в соответствии с приведенным выше растровым изображением мы можем получить:
Идентификатор пользователя: 1 вошел в систему 20191231
Идентификатор пользователя: 2, зарегистрированный в 20191230, 20200101
Идентификатор пользователя: 4 вошли в систему 20 191 231
Остальные не авторизованы

Битмап в Redis

Версия 2.2.0 была получена из «новой технологии».Я думаю, вы увидите эту двойную кавычку и не примете ее всерьез.
недавно добавленныйsetbit,getbit,bitcountДождитесь нескольких команд, связанных с растровыми изображениями. Но на самом делеsetbitКоманда ожидания простоsetПросто расширение выше.

Введение в команду setbit

инструкцияSETBIT key offset value
сложностьO(1)
Устанавливает или очищает значение бита значения ключа (строка) на смещении (только 0 или 1).

Занятость места и время, необходимое для выделения места в первый раз

на MacBook Pro 2010 г.

  • Смещение 2^32-1 (выделено 512 МБ) занимает ~ 300 мс.
  • Смещение 2^30-1 (выделено 128 МБ) занимает ~ 80 мс.
  • Смещение 2 ^ 28-1 (выделено 32 МБ) занимает ~ 30 мс.
  • Смещение 2 ^ 26-1 (присвоение 8 МБ) нужно 8 мс. -
    Приблизительная формула расчета занимаемой площади:($offset/8/1024/1024)MB

сцены, которые будут использоваться

Статистика активных пользователей

Используйте время в качестве cacheKey, затем идентификатор пользователя в качестве смещения, установите значение 1, если он был активен в этот день.
Поэтому, если я вычисляю активных пользователей определенного дня/месяца/года (на данный момент только один день в сети в течение статистического периода называется активным), пожалуйста, дайте следующую команду redis
ЗаказBITOP operation destkey key [key ...]
Описание: выполнить побитовую операцию над одним или несколькими строковыми ключами, содержащими двоичные биты, и сохранить результат в destkey.
Примечание. Команда BITOP поддерживает любую из четырех операций AND, OR, NOT, XOR.

//日期对应的活跃用户
$data = array(
    '2020-01-10' => array(1,2,3,4,5,6,7,8,9,10),
    '2020-01-11' => array(1,2,3,4,5,6,7,8),
    '2020-01-12' => array(1,2,3,4,5,6),
    '2020-01-13' => array(1,2,3,4),
    '2020-01-14' => array(1,2)
);
//批量设置活跃状态
foreach($data as $date=>$uids) {
    $cacheKey = sprintf("stat_%s", $date);
    foreach($uids as $uid) {
        $redis->setBit($cacheKey, $uid, 1);
    }
}

$redis->bitOp('AND', 'stat', 'stat_2020-01-10', 'stat_2020-01-11', 'stat_2020-01-12');

//总活跃用户:6
echo "总活跃用户:" . $redis->bitCount('stat') . PHP_EOL;

$redis->bitOp('AND', 'stat1', 'stat_2020-01-10', 'stat_2020-01-11', 'stat_2020-01-14') . PHP_EOL;

//总活跃用户:2
echo "总活跃用户:" . $redis->bitCount('stat1') . PHP_EOL;

$redis->bitOp('AND', 'stat2', 'stat_2020-01-10', 'stat_2020-01-11') . PHP_EOL;

//总活跃用户:8
echo "总活跃用户:" . $redis->bitCount('stat2') . PHP_EOL;

Если предположить, что текущий сайт имеет 5000 Вт пользователей, то данные за один день примерно равны50000000/8/1024/1024=6MB

Регистрация пользователя, онлайн-статус пользователя

Эти все одинаковые, не буду, пора тебя потихоньку убивать.Peace&Love

На что нужно обратить внимание

Требуется операция сжатия

Я думаю, что познание людьми вещей должно пройти через懵懂但美好憧憬 -> 被欺骗(坑)感情 -> 再次审视自己和事物создать客观正确Познание — чем больше вы цените, тем больше вы понимаете

Отличительной особенностью Redis Bitmap является то, что он сжимает пространство для хранения. При повседневном использовании стоимость этого сжатия сильно загружает ЦП.

SetBit с большим объемом данных вызовет большое количество сетевых запросов. Итак, обычно массив идентификаторов помещается в программуpack()Пусть переносная карта станет строкой. Еще раз установил в Redis.

Это означает, что при извлечении необходимоunpack()Распаковать строку в массив идентификаторов. Но благодаря алгоритму этот шаг не слишком сложен

Ограниченное хранилище данных

Кроме того, данные, хранящиеся в ta, довольно ограничены, например:

// 正常情况的 用户 id:1、3 登录数组:
'login20191230' => array(
    1 => array(
        'user_id' => 1,
        'login_ip' => 'x.x.x.x',
        'usage_agent' => 'xxx'
    ),
    3 => array(
        'user_id' => 3,
        'login_ip' => 'x.x.x.x',
        'usage_agent' => 'xxx'
    ),
)

// bitmap 的 登录数组
'login20191230' => array(
    0 => 0,
    1 => 1,   
    2 => 0,
    3 => 1,
)

где его можно использовать只有'login20191230' и ключ в массиве

Вы спросите, а разве значение в массиве не похоже на то, что его можно изменить?
Я дам вам выражение, чтобы понять для себя 😑. Ничего страшного придется подкинуть, но просто платежный баланс не сбалансирован.