简单的签到代码_PHP实现一个小小的签到功能,到底用MySQL还是Redis?

dd91a6bf24db73539247c083813e3b43.gif

来源 | http://suo.im/5EWN3k

今天,看下签到功能怎么选择?

现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜~

c535188d5a1b4ec07e6c469f596ee6cd.png微博签到

如移动app ,签到送流量等活动,68bdec1ae1c239b1620e6729c39d4f85.png移动app签到

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

下面我们从技术方面看看常用的实现手段:

一. 方案1

直接存到数据库MySQL

用户表如下:89ca623c96797ee47372d9b65349e05d.pnglast_checkin_time 上次签到时间

checkin_count 连续签到次数

记录每个用户签到信息

签到流程

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版本开始支持的功能,一般用于标识状态,

另外 ,用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);  }

以下是用户连续签到计算

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

还有什么需求呢?可以自己试着去实现

三. 优缺点比较

1、直接MySQL

思路简单,容易实现;

缺点:占用空间大,表更新比较多,影响性能,数据量大时需要用cache辅助;

2、Redis bitmap

优点是:占用空间很小,纯内存操作,速度快;

缺点是:记录的信息有限,只有一个标识位;

偏移量不能大于2^32,512M;大概可以标识5亿个bit位,绝大多数的应用都是够用的啦;

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

好啦,两种方式介绍完了,各有利弊,你喜欢哪种方式呢?

看完本文有收获?点赞、分享是最大的支持!

17d9c84c4076a118981e8f6ebc4678af.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis 6】缓存穿透、缓存雪崩、缓存击穿(附解决方案、代码)

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

8软件遇到的问题及解决方法_Excel工作表中的8个常见问题,你一定遇到过,附解决方法...

在Excel工作表中&#xff0c;最常用的还是一些技巧&#xff0c;如果能够熟练掌握&#xff0c;对于工作效率的提高绝对不是一点点哦&#xff0c;结合工作实际&#xff0c;小编对工作中常见的问题进行了总结&#xff0c;一共有8类&#xff0c;你一定也遇到过……一、Excel工作表常…

unity着色器和屏幕特效开发秘笈_Oculus研发分享:开发移动VR内容时应避免的PC渲染技术...

查看引用/信息源请点击&#xff1a;映维网开发移动VR内容时应避免的PC渲染技术&#xff08;映维网 2019年11月25日&#xff09;有不少开发者都是以与PC相同的方式来开发Quest游戏&#xff0c;但这可能会导致优化性能方面出现大量困难。Oculus软件工程师特雷弗达什&#xff08;T…

Java包装类、java中的方法传参机制:按值调用

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 方法…

尤克里里怎么样_尤克里里和吉他区别?尤克里里与吉他相比有什么不可替代的优势...

尤克里里和吉他有什么区别&#xff1f;想必大家都见过尤克里里吧&#xff0c;就是类似吉他形状的一种小型弦拨乐器。我们可以简单的认为&#xff1a;尤克里里是简化版本的吉他&#xff0c;更加简单&#xff0c;更加便宜。小编弹的就是尤克里里2.从外观上&#xff1a;吉他很大&a…

饿汉懒汉单例设计模式的使用及区别、java中的import关键字

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

广电运通不好进吗_我可以说郑州新风的安装大部分都是垃圾吗?

说郑州的新风安装都是垃圾&#xff0c;这话很无礼&#xff0c;很自大&#xff0c;很傲慢&#xff0c;但是我能说确实是这样嘛&#xff1f;其实包括我以前安装的也不合格——虽然我不是故意的。这几年见过许多家同行安装的新风&#xff0c;可以说目前见到的很多家都不合格&#…

Java迭代器和Collection接口

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

atlas安装需要kafka吗_Atlas 2.1.0 实践(2)—— 安装Atlas

在完成Atlas编译以后&#xff0c;就可以进行Atlas的安装了。Atlas的安装主要是安装Atlas的Server端&#xff0c;也就Atlas的管理页面&#xff0c;并确保Atlas与Kafka Hbase Solr等组件的集成。Atlas的系统架构如下&#xff0c;在确保 底层在完成Atlas编译以后&#xff0c;就可以…

ue4中隐藏灯光和相机图标_[HDRP]物理灯光是什么?科普向

HDRP抛弃了Bulitin的灯光&#xff0c;改用物理单位以及物理属性。那么物理灯光到底是什么&#xff1f;请点赞评论来支持作者&#xff0c;提前祝大家新年快乐。https://connect.unity.com/p/hdrp-wu-li-deng-guang-shi-shi-yao-ke-pu-xiang​connect.unity.com同步更新unity con…

私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦投资区块链&#xff0c;猛戳&#xff1a;火星财经App下载来源&#xff1a;学习区块链原文标题&#xff1a;「…

关于List集合类ArrayList、LinkedList、Vector详解

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

1562a检测软件_洛达1562a空间音频版评测!!!

哈喽大家好&#xff01;这里是小泽&#xff0c;一个不专业的Beatboxer~~~今天给大家带来一期HQB最新空间音频版洛达1562a耳机的评测视频&#xff0c;建议先赞再看&#xff01;&#xff08;滑稽&#xff09;听说你不点赞&#xff1f;昨晚拍了一晚&#xff0c;但是因为是第一次搞…

python 趣味编程课_青少年编程:Python趣味编程基础入门课程

课程目录 章节1:编程课前说明试看 课时1 编程课前说明07:49可试看 章节2:第一章 Python基础-认识环境试看 课时2 1、什么是计算机程序和编程&#xff1f;08:48可试看 课时3 2、为什么学习编程&#xff1f;03:10可试看 课时4 3、Python的安装11:48可试看 课时5 4、用Python编写第…

shell181网格划分_ANSYS中Shell181单元介绍谁知道

再毕业设计做模型中要应用到SHELL181单元&#xff0c;那么这个单元有什么好处谁能具体的告诉我下&#xff0c;我有英文但是有的地方翻译不通。或者谁能帮我翻译一下~谢谢~SHELL181issuitableforanalyzingth...再毕业设计做模型中要应用到SHELL181单元&#xff0c;那么这个单元有…

关于Set集合类你都知道什么?来自《卷Ⅰ》的灵魂提问

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

流程图虚线框表示什么_UI设计|APP的交互线框布局设计

一.流程图设计流程图(Flow Chart)&#xff1a;用图示的方式反映出特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程。流程图的四种基本结构&#xff1a;顺序结构&#xff0c;条件结构(又称选择结构)&#xff0c;循环结构&#xff0c;分支结构。1.流程图的常用符…

使用Redis完成商品秒杀业务

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

表格列隐藏_【excel每日提升】Excel隐藏列,不让别人打开!

【新朋友】点击标题下面蓝色字“王俊东“关注。 【老朋友】点击右上角&#xff0c;转发或分享本页面内容。excel系列课程excel特效系列课程开始了&#xff0c;今天第2节&#xff01;第1节&#xff1a;Excel有公式的单元格标记颜色&#xff0c;很简单&#xff01;第2节&#xf…

map与weakmap,ES6 Map和WeakMap有什么区别?

Looking this and this MDN pages it seems like the only difference between Maps and WeakMaps is a missing "size" property for WeakMaps. But is this true? Whats the difference between them?解决方案The experienced JavaScript programmer will notice…