日アクティブユーザーの統計と持続化-Redis

11623 ワード

統計日活ユーザーはまずプロジェクトの中ですべての要求に対して統計をして、重量を並べて、最終的に今日どれだけのユーザーがこのプロジェクトにアクセスしたかを得る必要があります.このようなユーザ要求応答に関係のないデータは、キューを使用して処理される.
1.ルーティングミドルウェアを設定し、各要求およびパラメータをメッセージキューに配信する.2、消費キュー情報で集計する.3、一般的にバックグラウンドで日活量データを見る.
このシーンではMySQLは使用できません.操作が頻繁すぎるため、redisはより良い実装方法があります.
方法1:setを使用して各リクエストのuseridを集合の要素とし,集合は自動的に重み付けされるので,最終的には集合中の要素の数を知るだけでよい.keyの有効期限は1日少し過ぎに設定し、MySQLに永続化できるようにします.加入:sadd activity:1001:20191202 21001数量:scard activity:1001:20191202持久化:毎日未明に昨日のデータを書くことを選択して、それから昨日のkeyを削除して、繰り返し書くことを防止して、無駄にします.
方法2:bit操作に慣れていない学生は公式マニュアルを参考にすることができ、bitビット操作はメモリスペースを節約し、ブロンフィルタもbitを通じてすべてのkeyを格納する.最終的な個数しか欲しくないので、どのユーザがアクセスしたのかは知りたくないので、userid対応のbitビットを1に設定すればいいだけです.
public static function setActiveData($userId, $cacheKey, $expire){
     
    if(!Redis::exists($cacheKey)){
     
        Redis::setbit($cacheKey, $userId, 1);
        if($expire > 0){
     
            Redis::expire($cacheKey, $expire);
        }
    }else{
     
        Redis::setbit($cacheKey, $userId, 1);
    }
}

keyの有効期限は上記と同じように設定します.永続化bitcount keyは、1にセットされたビットの個数、すなわち日活数を得ることができる.
この2つの方法を比較して、使用シーンに基づいて、毎日数百万で生きていると、方法1の集合には数百万の要素がありますが、実際には、具体的にどの要素があるのか、個数だけを知りたいと思っています.明らかに方法2が適切です.
このニーズに応じてsetとbitで使用するメモリ量を比較します
それぞれ10万個のidを格納する
まずinfoコマンドを使用して現在使用されているメモリを表示します.
# Memory
used_memory:257871752
used_memory_human:245.93M
used_memory_rss:257833848
used_memory_rss_human:245.89M
used_memory_peak:260611440
used_memory_peak_human:248.54M

setの使用
function test11(){
     
    $start = microtime(true);
    $num = 400000;
    for($i=0;$i<100000;$i++){
     
        Redis::sadd('testbit', $num);
        $num++;
    }
    $end = microtime(true);
    $this->info('time: '.($end - $start));
}

使用時13.095961093903メモリ消費量:7.59 M
# Memory
used_memory:265835688
used_memory_human:253.52M
used_memory_rss:265797776
used_memory_rss_human:253.48M
used_memory_peak:265835688
used_memory_peak_human:253.52M

testbitを削除
bitの使用
function test12(){
     
    $start = microtime(true);
    $num = 400000;
    for($i=0;$i<100000;$i++){
     
        Redis::setbit('testbit', $num, 1);
        $num++;
    }
    $end = microtime(true);
    $this->info('time: '.($end - $start));
}

使用時間:12.112451076508メモリ使用量:0.1 M
# Memory
used_memory:257973528
used_memory_human:246.02M
used_memory_rss:257935616
used_memory_rss_human:245.99M
used_memory_peak:265835688
used_memory_peak_human:253.52M

数十倍の差がある.