现在的网站和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

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

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

mysql 签到 存储,MySQL和Redis实现用户签到,你喜欢怎么实现?相关推荐

  1. 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?

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

  2. redis实现用户签到,统计活跃用户,用户在线状态,用户留存率

    开发的过程中,可能会遇到用户签到.统计当天的活跃用户.以及每个用户的在线状态,用户留存率的开发需求,可能会用传统的方法,根据相应的需求设计数据库表等,但这样耗费的存储空间大,以及性能方面也不会太好,下 ...

  3. redis实现用户签到以及签到统计

    1:数据库实现. 最简单的做法就是创建一个表,专门来存取用户的签到信息. 但是呢,这么做会有一个问题? 用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数 ...

  4. mysql 页 存储,MySQL InnoDB Engine--数据页存储和UPDATE操作

    叶子节点数据: ## 主键索引叶子节点数据 06 06 06 00 00 10 00 27 41 41 30 30 30 31 00 00 00 00 05 4F 38 00 00 00 91 04 ...

  5. Redis实战案例及问题分析之-附近商铺(GEO数据结构)-用户签到(BitMap)-UV统计(HyperLogLog)

    附近商铺 GEO数据结构 GEO就是Geolocation的简写形式,代表地理坐标.Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据.常见的命令有: G ...

  6. java sql变更存储,MySQL更改数据库数据存储目录,mysql数据存储

    MySQL更改数据库数据存储目录,mysql数据存储 MySQL数据库默认的数据库文件位于 /var/lib/mysql 下,有时候由于存储规划等原因,需要更改 MySQL 数据库的数据存储目录.下文 ...

  7. CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

    文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...

  8. mysql和redis统计网站活跃度,最代码网站用户私信列表采用mysql union查询优化为Redis查询的经验和相关代码片段分享...

    由于用户和私信的数据量逐渐增加,查询用户和其他用户的私信合并排重排序的sql语法给mysql带来了很大的压力,springdata jpa的hql查询语法如下:select id from (sele ...

  9. 数据库实例:mysql与redis结合用户登录

    加入redis后登录逻辑如下图,将图中nosql的位置换为redis即可 用户数据存的键为用户名,值为密码 将原来MySQL操作的代码封装到一个方法中,代码如下 defmysql_login():   ...

最新文章

  1. 我的LDAP使用手记(Fedora-ds) 备忘用
  2. db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?
  3. java lambda循环_使用Java 8 Lambda简化嵌套循环
  4. Linux 退出vi编辑模式
  5. Java后端测试概述
  6. 从Exchange 通往Office 365系列(五)部署MailBox服务器
  7. 计算机一级考试表格题2010,2010年计算机一级考试一级WINDOWS笔试模拟题及答案
  8. JavaScript执行机制-node事件循环
  9. 黑客入侵WinXP常用七个技巧
  10. 使用BackTrack4破解Windows用户密码
  11. DB9接口定义 串口接口定义 MAX232电路
  12. NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)
  13. 用PLC和触摸屏设计用户可编程的控制项目
  14. IPM是如何控制三相电机的
  15. >> 读书记录_2015~2020
  16. 魅族mx4pro刷linux,老树开新花 魅族MX4 Pro刷Flyme 5体验
  17. 网站接入QQ登录功能的实现
  18. 常用web服务器架构理解
  19. 81192!请返航!
  20. 数据库银行业务基础知识

热门文章

  1. 苹果新iPhone未见踪影,三星Galaxy Note9已经抢跑
  2. dnf剑魂buff等级上限_DNF:超时空最垃圾的几个职业,剑魂榜上有名,第一炸团必有他...
  3. Ant中build.xml对多module部署配置
  4. 在页面实现qq跳转链接
  5. 【ybtoj 高效进阶 1.5】【广搜】 荆轲刺秦王
  6. app内执行apk安装报错:exposed beyond app through Intent.getData()
  7. C语言与汉语结构类比理解入门之指针
  8. vue 后台登录滑动验证
  9. 王振2020-5-29笔记
  10. H3C AC:如何通过Web平台进行AC软件的升级?