<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          簽到功能,用 MySQL 還是 Redis ?

          共 3418字,需瀏覽 7分鐘

           ·

          2021-05-17 11:19

          關(guān)注我們,設(shè)為星標,每天7:30不見不散,架構(gòu)路上與您共享 

          回復(fù)"架構(gòu)師"獲取資源

          今天看下簽到功能怎么選擇?

          現(xiàn)在的網(wǎng)站和app開發(fā)中,簽到是一個很常見的功能,如微博簽到送積分,簽到排行榜

          微博簽到

          如移動app ,簽到送流量等活動,移動app簽到

          用戶簽到是提高用戶粘性的有效手段,用的好能事半功倍!

          下面我們從技術(shù)方面看看常用的實現(xiàn)手段:

          一. 方案1

          直接存到數(shù)據(jù)庫MySQL

          用戶表如下:last_checkin_time 上次簽到時間

          checkin_count 連續(xù)簽到次數(shù)

          記錄每個用戶簽到信息

          簽到流程

          1.用戶第一次簽到

          last_checkin_time = time()
          checkin_count=1

          2.用戶非第一次簽到,且當天已簽到

          什么也不做,返回已簽到。

          3.用戶非第一次簽到,且當天還未簽到

          a.昨天也有簽到

          last_checkin_time = time()
          checkin_count= checkin_count+1

          b.昨天沒有簽到

          last_checkin_time = time()
          checkin_count=1

          使用yii實現(xiàn)的代碼如下:

          //0點
          $today_0 = strtotime(date('y-m-d'));
          //昨天0點
          $yesterday_0 = $today_0-24*60*60;
          $last_checkin_time = $model->last_checkin_time;if(empty($last_checkin_time)){
           //first checkin
           $model->last_checkin_time = time();
           $model->checkin_count = 1;  
          }else{
           if($today_0 < $last_checkin_time){
            //checkin ed 當天已簽到過
            return json_encode(['code' => 0, 'msg' => '已簽到成功']);
           } //昨天簽到過 if($last_checkin_time < $today_0 && $last_checkin_time > $yesterday_0){
            $model->last_checkin_time = time();
            $model->checkin_count = $model->checkin_count + 1; 
           }else{
            //昨天沒簽到過,重新計數(shù)
            $model->last_checkin_time = time();
            $model->checkin_count = 1;
           }}$rs = $model->save();

          二. 方案2

          redis實現(xiàn)方案,使用bitmap來實現(xiàn),bitmap是redis 2.2版本開始支持的功能,一般用于標識狀態(tài),

          另外 ,用bitmap進行當天有多少人簽到非常的方便,使用bitcount

          redis->BITCOUNT($key);

          簽到流程

          設(shè)置兩個bitmap ,

          • 一個以每天日期為key ,每個uid為偏移量

          • 一個以用戶uid為key ,當天在一年中的索引為偏移量,

          這樣記錄一個用戶一年的簽到情況僅需要365*1bit

          以下是簽到代碼

          //每天一個key
            $key = 'checkin_' . date('ymd');
            if($redis->getbit($key$uid)){
             //已簽到   return json_encode(['code' => 0, 'msg' => '已簽到成功']);
            }else{
             //簽到   $redis->setbit($key$uid, 1);
             $redis->setbit('checkin_'.$uid , date('z'), 1);
            }

          以下是用戶連續(xù)簽到計算

          public static function getUserCheckinCount($uid){
            $key =  'checkin_'.$uid;
            $index = date('z');
            $n = 0;
            for($i = $index$i>=0;$i--){
             $bit = Yii::$app->redis->getbit($key$i);   if($bit == 0) break;
             $n++;  }  return $n;
           }

          以下是計算一天簽到用戶數(shù)

          $key = 'checkin_' . date('ymd');
          $redis = Yii::$app->redis;$count = $redis->BITCOUNT($key);

          還有什么需求呢?可以自己試著去實現(xiàn)

          三. 優(yōu)缺點比較

          1.直接MySQL

          思路簡單,容易實現(xiàn);

          缺點:占用空間大,表更新比較多,影響性能,數(shù)據(jù)量大時需要用cache輔助;

          2.Redis bitmap

          優(yōu)點是:

          占用空間很小,純內(nèi)存操作,速度快;

          缺點是 :

          記錄的信息有限,只有一個標識位;

          偏移量不能大于2^32,512M;大概可以標識5億個bit位,絕大多數(shù)的應(yīng)用都是夠用的啦;

          偏移量很大的時候可能造成 Redis 服務(wù)器被阻塞;所以要考慮切分。

          好啦,兩種方式介紹完了,各有利弊,你喜歡哪種方式呢?

          歡迎討論!

          文章來源:http://suo.im/5EWN3k


          到此文章就結(jié)束了。如果今天的文章對你在進階架構(gòu)師的路上有新的啟發(fā)和進步,歡迎轉(zhuǎn)發(fā)給更多人。歡迎加入架構(gòu)師社區(qū)技術(shù)交流群,眾多大咖帶你進階架構(gòu)師,在后臺回復(fù)“加群”即可入群。







          這些年小編給你分享過的干貨

          Kubernetes的前世今生

          你們公司的架構(gòu)師是什么樣的?

          《Docker與CI持續(xù)集成/CD持續(xù)部署》

          《還有40天,Java 11就要橫空出世了》

          《JDK 10 的 109 項新特性》

          《學(xué)習(xí)微服務(wù)的十大理由》

          轉(zhuǎn)發(fā)在看就是最大的支持??


          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美爱爱免费视频 | 蜜桃视频 成人app ios | 国产小说一区二区三区国产 | 日本黄色电影网站视频 | 羞羞午夜福利视频 |