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

          共 2447字,需瀏覽 5分鐘

           ·

          2020-09-17 04:50

          程序員的成長之路
          互聯網/程序員/技術/資料共享?
          關注


          閱讀本文大概需要 2.8 分鐘。

          來自:網絡

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

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

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

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

          下面我們從技術方面看看常用的實現手段:

          一. 方案1


          直接存到數據庫MySQL

          用戶表如下:

          last_checkin_time 上次簽到時間

          checkin_count 連續(xù)簽到次數

          記錄每個用戶簽到信息

          簽到流程


          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實現的代碼如下:
          //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{ //昨天沒簽到過,重新計數 $model->last_checkin_time = time(); $model->checkin_count = 1; }}$rs = $model->save();

          二. 方案2


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

          另外 ,用bitmap進行當天有多少人簽到非常的方便,使用bitcount
          count=redis->BITCOUNT($key);


          簽到流程


          設置兩個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; }

          以下是計算一天簽到用戶數
          $key = 'checkin_' . date('ymd');$redis = Yii::$app->redis;$count = $redis->BITCOUNT($key);

          還有什么需求呢?可以自己試著去實現


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


          1、直接MySQL

          思路簡單,容易實現;

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

          2、Redis bitmap

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

          缺點是:記錄的信息有限,只有一個標識位;

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

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

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

          推薦閱讀:

          沒有這 29 款插件的 Chrome 是沒有靈魂的

          Nginx + Spring Boot 實現負載均衡

          5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內回復「2048」,即可免費獲?。?!

          微信掃描二維碼,關注我的公眾號

          朕已閱?

          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  久久中文字幕7区 | 岛国成人电影在线网站 | 色婷婷婷婷 | 91精品无码人妻系列 | 2027AV天堂 |