<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>

          一個(gè)小小的簽到功能,到底用MySQL還是Redis?

          共 2594字,需瀏覽 6分鐘

           ·

          2020-11-10 20:26

          來(lái)源 |?http://suo.im/5EWN3k


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


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

          微博簽到

          如移動(dòng)app ,簽到送流量等活動(dòng),移動(dòng)app簽到

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


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

          一. 方案1


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


          用戶表如下:last_checkin_time 上次簽到時(shí)間


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


          記錄每個(gè)用戶簽到信息


          簽到流程


          1.用戶第一次簽到

          last_checkin_time = time()checkin_count=1

          2.用戶非第一次簽到,且當(dāng)天已簽到


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


          3.用戶非第一次簽到,且當(dāng)天還未簽到


          a.昨天也有簽到

          last_checkin_time = time()checkin_count= checkin_count+1

          b.昨天沒(méi)有簽到

          last_checkin_time = time()checkin_count=1

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

          //0點(diǎn)$today_0 = strtotime(date('y-m-d'));//昨天0點(diǎn)$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 當(dāng)天已簽到過(guò)  return json_encode(['code' => 0, 'msg' => '已簽到成功']); } //昨天簽到過(guò) if($last_checkin_time < $today_0 && $last_checkin_time > $yesterday_0){  $model->last_checkin_time = time();  $model->checkin_count = $model->checkin_count + 1;  }else{  //昨天沒(méi)簽到過(guò),重新計(jì)數(shù)  $model->last_checkin_time = time();  $model->checkin_count = 1; }}$rs = $model->save();

          二. 方案2


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


          另外 ,用bitmap進(jìn)行當(dāng)天有多少人簽到非常的方便,使用bitcount

          count=redis->BITCOUNT($key);


          簽到流程


          設(shè)置兩個(gè)bitmap ,


          • 一個(gè)以每天日期為key ,每個(gè)uid為偏移量

          • 一個(gè)以用戶uid為key ,當(dāng)天在一年中的索引為偏移量,


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


          以下是簽到代碼

          //每天一個(gè)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ù)簽到計(jì)算

          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; }

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

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

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


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


          1、直接MySQL


          思路簡(jiǎn)單,容易實(shí)現(xiàn);


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


          2、Redis bitmap


          優(yōu)點(diǎn)是:占用空間很小,純內(nèi)存操作,速度快;


          缺點(diǎn)是:記錄的信息有限,只有一個(gè)標(biāo)識(shí)位;


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


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


          好啦,兩種方式介紹完了,各有利弊,你喜歡哪種方式呢?歡迎在評(píng)論區(qū)留言 。


          - END -

          長(zhǎng)按進(jìn)入小程序,進(jìn)行30天簽到

          打卡第15期,20本新書(shū),快來(lái)看看!

          (更多精彩值得期待……)

          最近熱文:
          20套Java實(shí)戰(zhàn)項(xiàng)目視頻,涉及SpringBoot、SSM、SpringCloud等等!
          給IDEA換個(gè)酷炫的主題,這個(gè)有點(diǎn)哇塞?。?/a>
          大神你寫(xiě)這么騷的代碼,不怕被揍么?
          為啥計(jì)算機(jī)非得要自帶操作系統(tǒng)呢?
          神器在手,變量命名從此變得高大上!
          3個(gè)開(kāi)源的快速開(kāi)發(fā)平臺(tái),前后端都有,項(xiàng)目經(jīng)驗(yàn)又有著落了!
          LeetCode1-80題匯總,速度收藏!

          2T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,軟考,英語(yǔ),等等。在公眾號(hào)內(nèi)回復(fù)「資源」,即可免費(fèi)獲??!回復(fù)「社群」,可以邀請(qǐng)你加入讀者群!

          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  成人综合婷婷国产精品久久 | 在线观看欧美日韩 | 大香蕉在线75 | 久久久久亚洲AV成人无码电影 | AAAAA黄片 |