redis 抽獎功能,投票應用是用mysql還是redis_簽到功能,用 MySQL 還是 Redis?

 2023-11-11 阅读 21 评论 0

摘要:本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯系用戶簽到是提高用戶粘性的有效手段,用的好能事半功倍!下面我們從技術方面看看常用的實現手段:一. 方案1直接存到數據庫MyS

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯系

d71f76268bf8844d698977f37ebdcf1a.png

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

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

一. 方案1

直接存到數據庫MySQL

redis 抽獎功能。用戶表如下:

46336fce87c1e47d17bcc16d552b4bf7.png

last_checkin_time上次簽到時間

checkin_count 連續簽到次數

記錄每個用戶簽到信息

簽到流程

1.用戶第一次簽到

redis怎么使用,last_checkin_time = time()

checkin_count=1

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

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

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

a.昨天也有簽到

微信現場簽到、checkin_count= checkin_count+1

b.昨天沒有簽到

使用yii實現的代碼如下:

//0點

$today_0 = strtotime(date('y-m-d'));

//昨天0點

redis sql,$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{

redis的使用、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;

redis哨兵選舉、}else{

//昨天沒簽到過,重新計數

$model->checkin_count = 1;

}}$rs = $model->save();

二. 方案2

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

redis和mysql區別。另外 ,用bitmap進行當天有多少人簽到非常的方便,使用bitcount

redis->BITCOUNT($key);

設置兩個bitmap ,

一個以每天日期為key ,每個uid為偏移量一個以用戶uid為key ,當天在一年中的索引為偏移量,這樣記錄一個用戶一年的簽到情況僅需要365*1bit

以下是簽到代碼

//每天一個key

redis與mysql、$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);

redis配合mysql,}

以下是用戶連續簽到計算

public static function getUserCheckinCount($uid){

$key = 'checkin_'.$uid;

$index = date('z');

$n = 0;

redis取代mysql?for($i = $index; $i>=0;$i--){

$bit = Yii::$app->redis->getbit($key, $i); if($bit == 0) break;

$n++; } return $n;

}

以下是計算一天簽到用戶數

$key = 'checkin_' . date('ymd');

mysql跟redis整合,$redis = Yii::$app->redis;$count = $redis->BITCOUNT($key);

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

三. 優缺點比較

1.直接MySQL

思路簡單,容易實現;

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

redis排行榜實現?2.Redis bitmap

優點是:

占用空間很小,純內存操作,速度快;

缺點是 :

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

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

redis哨兵選舉機制,偏移量很大的時候可能造成 Redis 服務器被阻塞;所以要考慮切分。

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

歡迎討論!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/170498.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息