Как перед просмотром, разрабатывать привычку ❤️
Что такое растровое изображение
- 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' и ключ в массиве
Вы спросите, а разве значение в массиве не похоже на то, что его можно изменить?
Я дам вам выражение, чтобы понять для себя 😑. Ничего страшного придется подкинуть, но просто платежный баланс не сбалансирован.