Я использую растровое изображение redis для записи действий пользователя через год, если пользователь войдет в систему в первый день года, я установлю первый бит ключа равным 1. Значение redis будет следующим:
ключ: user.18.action
(18 — это идентификатор пользователя)
значение: (растровое изображение) 000100000000000000000000 … (длиной около 365 бит)
но когда я пытался получить значение, GET user.18.action
возвращается "\x10"
,
В PHP, как мне преобразовать эти строки в 000100000000000000000000...
вещь?
На самом деле, я использую приведенный ниже код для его реализации, но это нормально? и есть ли лучшее разрешение?
$bitmap = $this->redis->get('user.18.action');
$binstrlen = strlen($bitmap);
$hex = bin2hex($bitmap);
$str = str_baseconvert($hex, 16, 2);
var_dump(str_pad($str, $binstrlen * 8, '0', STR_PAD_LEFT));
function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for ($i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else $q = $str;
if (intval($tobase) != 10) {
$s = '';
while (bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else $s = $q;
return $s;
}
function bitmap_human($bitmap){
$bytes = unpack('C*', $bitmap);
$bin = join(array_map(function($byte){
return sprintf("%08b", $byte);
}, $bytes));
return $bin;
}
Я понял это, работает хорошо.
Функция bitmap_human на моей голове
/**
* @param \Redis $redis
* @param $key
* @param $or_login_user
* @return array
*/
protected function parseUserList(\Redis &$redis, $key)
{
$bitmap = $this->bitmap_human($redis->get($key));
$bitmap_length = strlen($bitmap);
$bitSet = [];
for ($i = 0; $i < $bitmap_length; $i++) {
if (1 == $bitmap[$i]) {
$bitSet[] = $i;
}
}
if(empty($bitSet)){
return [];
}
$login_user = M('user')->cache(600)->field('id,phone,nickname')->where(['id'=>['in',$bitSet]])->select();
return $login_user;
}