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

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

微博签到

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

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

欢迎留言讨论!

作者:一起web编程

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

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

一个小小的签到功能,到底用MySQL还是Redis?相关推荐

  1. 聊天记录存redis还是mysql_一个小小的签到功能,到底用MySQL还是Redis?

    今天,看下签到功能怎么选择? 现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜~ 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有 ...

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

    来源 | http://suo.im/5EWN3k 今天,看下签到功能怎么选择? 现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜~ 微博签到 如移动app ,签到送流量 ...

  3. 简单的签到代码_签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动. 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常用的 ...

  4. 投票应用是用mysql还是redis_签到功能,用 MySQL 还是 Redis?

    本文转载自[微信公众号:java进阶架构师,ID:java_jiagoushi]经微信公众号授权转载,如需转载与原文作者联系 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看 ...

  5. mysql 签到_签到功能,用mysql还是redis?

    之前发过一篇:点赞功能用mysql还是redis​mp.weixin.qq.com ?受到大家喜欢,今天看下签到功能怎么选择? 现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到 ...

  6. 签到功能,用 MySQL 还是 Redis ?

    现在的网站和app开发中,签到是一个很常见的功能,如微博签到送积分,签到排行榜. 如移动app ,签到送流量等活动. 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面我们从技术方面看看常用的 ...

  7. 语音聊天室源码开发点赞功能,用 MySQL 还是 Redis ?

    为了提升用户在语音聊天室源码中的互动性,一般在开发动态广场功能时会支持用户间对动态进行点赞,所以点赞功能可以说是语音聊天室源码开发的基础性功能,今天我们就来聊聊点赞.评论.收藏等这些场景的db数据库设 ...

  8. 积分签到mysql_简易积分签到功能java代码实现实现Redis缓存数据

    -------需求说明 ---- 需求分析 积分签到处于app页面"我的",用户会频繁的来回切换,如果将数据全部存储到数据库中然后去数据库中做查询,所以这里我才用的Redis缓存的 ...

  9. mysql 去重_点赞功能,用 MySQL 还是 Redis ?

    点赞功能是目前app开发基本的功能 今天我们就来聊聊点赞.评论.收藏等这些场景的db数据库设计问题~ 1. 我们先来看看场景的需求: 显示点赞数量 判断用户是否点过赞,用于去重,必须的判断 显示个人点 ...

  10. mysql 查询列表是否关注_点赞功能,用mysql还是redis?

    点赞是个很常见的功能,以前我在eblog中使用的点赞是先在redis中增长,然后定时同步数据库.那么除了这个还有其他方案吗?那你知道如何点赞去重吗?看看这篇文章. 点赞功能是目前 app 开发基本的功 ...

最新文章

  1. 如何清空DNS缓存Windowslinux
  2. Ubuntu Server 更改hostname
  3. c#_Task用法总结
  4. 聊一聊:Service层你觉得有用吗?
  5. ajax成功进入success但是获取不到返回值
  6. 11.16-18 lsci、ipcs、ipcrm:清除ipc相关信息
  7. linux 删除文件反选
  8. 安装Scala时报UnsupportedClassVersionError
  9. AutoPep8-----Pycharm自动排版工具
  10. android 手机号码显示加空格,Android实现输入手机号时自动添加空格
  11. ASP.NET页面——页面事件
  12. Kafka 分区备份实战
  13. oracle连表图解,oracle 表连接方式解析
  14. 用jsp代码完成购物车并且实现添加功能
  15. 一文了解新营销,数字经济时代如何以个人为中心重建品牌?
  16. ClickHouse遇见RoaringBitmap
  17. 对Autorun.inf类U盘病毒的攻防
  18. 一篇文章,只用看三遍,终生不忘网络分层
  19. 开发者的如何优雅的使用OSX
  20. Qt 关于去除虚线框的三种方法

热门文章

  1. Solidity基础入门知识---函数的访问权限和可见性
  2. Html5——WebSocket
  3. 如何用Python做舆情时间序列可视化?
  4. 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
  5. 用C#编程合并多个WORD文档
  6. 在苹果Mac上如何查找和删除文件?
  7. iOS 15 通知的新功能
  8. 区块链开发(一)搭建基于以太坊go-ethereum的私有链环境
  9. InDesign 2022 for mac排版布局和页面设计
  10. Texpad for Mac(LaTeX编辑器软件)