一個小小的簽到功能,到底用MySQL還是Redis?
閱讀本文大概需要 2.8 分鐘。
來自:網絡


一. 方案1

簽到流程
last_checkin_time = time()checkin_count=1
last_checkin_time = time()checkin_count= checkin_count+1
last_checkin_time = time()checkin_count=1
//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
簽到流程
一個以每天日期為key ,每個uid為偏移量
一個以用戶uid為key ,當天在一年中的索引為偏移量,
//每天一個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);}
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)缺點比較
推薦閱讀:
微信掃描二維碼,關注我的公眾號
朕已閱?
評論
圖片
表情

