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

如移动app ,签到送流量等活动。

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

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

一. 方案1

直接存到数据库MySQL

用户表如下:

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

二. 方案2

redis实现方案,使用bitmap来实现,bitmap是redis 2.2版本开始支持的功能,一般用于标识状态,

另外 ,用bitmap进行当天有多少人签到非常的方便,使用bitcount

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 服务器被阻塞;所以要考虑切分。

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

欢迎讨论!

作者:一起web编程
来源:http://suo.im/5EWN3k

简单的签到代码_签到功能,用 MySQL 还是 Redis ?相关推荐

  1. 简单的签到代码_开窗排序函数解决连续签到问题|SQL

    开窗排序函数除了在处理简单的排序问题外,它的应用场景远比我们想的要多.本文将对两个问题,介绍开窗排序函数的用法. 一.问题 有一张用户签到表[签到表],标记每天用户是否签到(说明:该表包含所有用户所有 ...

  2. 简单的签到代码_太神了吧!打开浏览器的一瞬就自动签到,经验积分礼物全到手...

    好的生活,不难也不贵 在大家在过年的这段时间里,很多小伙伴天天闲着在家无聊,于是每天都去什么网易云音乐.B 站直播.张大妈等打卡签个到.话说签到真是个好东西--只要小手一点,不仅可以获得经验提升等级, ...

  3. mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)

    1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...

  4. mysql用天兔监测什么_天兔监控服务器和mysql,redis等监控

    1:软件用途来源-官网 为所有数据库管理者.互联网企业数据库监控而设计 无需部署Agent,轻松监控1000+数据库实例,完善灵活的告警配置,详细的性能分析指标 部署环境: Linux环境:CentO ...

  5. 简单的签到代码_【SAS小恩的代码段】02样本分布、两群体与组合差异性检定

    为了响应停课不停学, 本人在吉林大学的课程教学上会大量使用SAS编程教学.同时本人撰写了两本SAS相关的教材,因此将会录制一连串视频,会以以下的材料陆续发布: ◆ SAS在财务研究中的应用  --&g ...

  6. 简单小程序代码_开个小程序店铺需要多少钱?

    大家都开发小程序了,自家也有个小本经营的店铺,为了能够有更多的客源,更大的销量,也想开个小程序,因为规模不算大,手头上资金也不是很充裕,所以开发小程序店铺需要多少钱就成为了第一步的考量,很多商家都不知 ...

  7. 简单小程序代码_小程序该如何运营

    小型程序升级有三种最重要的方法: 1.借助微信附近小程序功能实现客户扩展 大家可能都知道,微信平台具有附近小程序的功能.此功能使用户可以查看周围五公里范围内的所有小程序. 正是由于这个原因,一旦商人完 ...

  8. python简单好玩的代码_只需要9步100行Python代码就可以实现一个简单又好玩的弹球游戏...

    今天给大家分享一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~ 需要本文源码:私信回复[源码]即可获取 ...

  9. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

最新文章

  1. Netty深入浅出(一)入门
  2. python 遍历文件夹 提取文件内信息 存为新文件名_python获取遍历文件名称并分别保存为XLSX和CSV格式...
  3. Amazon Go亮相:消费者无需结账即可完成店面购物
  4. 神经网络训练中,错误数据集对模型结果的影响有多大
  5. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil
  6. MJRefresh上拉刷新下拉加载
  7. 留学生吐槽阿里面试几宗罪:槽点太多,不符合阿里大企业形象!
  8. win7 简体中文旗舰版 MSDN官方原版
  9. 智能AI文章伪原创工具免费使用注意事项与推荐
  10. SPSS一元线性回归
  11. 只用一个div制作太极图
  12. 一款简洁的税后工资计算器(2019)
  13. 关于DDS文件格式的说明
  14. FTP显示文件的修改时间与实际时间不一致
  15. 发现一个好用的MySQL数据库管理工具
  16. 两例司法实践撕开了一个口子,区块链应用落地会加速吗?
  17. STM32 烧录程序后上电不工作,但调试模式下可正常工作的解决办法
  18. entity 与dto 区别
  19. QT5.7+opencv3.0做的简易视频播放器
  20. iOS6和iOS7代码的适配(4)——tableView

热门文章

  1. springboot日志可视化_Springboot面试问题集锦
  2. mysql热块争用_Oracle 索引热块引起的latch争用实例分析(转)
  3. 程序显示文本框_vb程序语言题库
  4. 威纶通HMI常见问题
  5. 马化腾提问_互联网融合创新会带来哪些改变_知乎回答部分总结
  6. ORACLE LINUX 6.3 + ORACLE 11.2.0.3 RAC + VBOX安装文档
  7. nginx指定路径运行
  8. 数学之美札记:自然语言处理——从规则到统计
  9. Maven Ant 中截取字符串
  10. 路由器-路由器以及×××-Client之间的×××