mysql 签到 存储,MySQL和Redis实现用户签到,你喜欢怎么实现?
现在的网站和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实现用户签到,你喜欢怎么实现?相关推荐
- 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?
现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...
- redis实现用户签到,统计活跃用户,用户在线状态,用户留存率
开发的过程中,可能会遇到用户签到.统计当天的活跃用户.以及每个用户的在线状态,用户留存率的开发需求,可能会用传统的方法,根据相应的需求设计数据库表等,但这样耗费的存储空间大,以及性能方面也不会太好,下 ...
- redis实现用户签到以及签到统计
1:数据库实现. 最简单的做法就是创建一个表,专门来存取用户的签到信息. 但是呢,这么做会有一个问题? 用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数 ...
- 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 ...
- Redis实战案例及问题分析之-附近商铺(GEO数据结构)-用户签到(BitMap)-UV统计(HyperLogLog)
附近商铺 GEO数据结构 GEO就是Geolocation的简写形式,代表地理坐标.Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据.常见的命令有: G ...
- java sql变更存储,MySQL更改数据库数据存储目录,mysql数据存储
MySQL更改数据库数据存储目录,mysql数据存储 MySQL数据库默认的数据库文件位于 /var/lib/mysql 下,有时候由于存储规划等原因,需要更改 MySQL 数据库的数据存储目录.下文 ...
- CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的
文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...
- mysql和redis统计网站活跃度,最代码网站用户私信列表采用mysql union查询优化为Redis查询的经验和相关代码片段分享...
由于用户和私信的数据量逐渐增加,查询用户和其他用户的私信合并排重排序的sql语法给mysql带来了很大的压力,springdata jpa的hql查询语法如下:select id from (sele ...
- 数据库实例:mysql与redis结合用户登录
加入redis后登录逻辑如下图,将图中nosql的位置换为redis即可 用户数据存的键为用户名,值为密码 将原来MySQL操作的代码封装到一个方法中,代码如下 defmysql_login(): ...
最新文章
- 我的LDAP使用手记(Fedora-ds) 备忘用
- db2分页查询语句优化_面试官:数据量很大,分页查询很慢,怎么优化?
- java lambda循环_使用Java 8 Lambda简化嵌套循环
- Linux 退出vi编辑模式
- Java后端测试概述
- 从Exchange 通往Office 365系列(五)部署MailBox服务器
- 计算机一级考试表格题2010,2010年计算机一级考试一级WINDOWS笔试模拟题及答案
- JavaScript执行机制-node事件循环
- 黑客入侵WinXP常用七个技巧
- 使用BackTrack4破解Windows用户密码
- DB9接口定义 串口接口定义 MAX232电路
- NOI / 2.5基本算法之搜索7834:分成互质组(详细讲解)
- 用PLC和触摸屏设计用户可编程的控制项目
- IPM是如何控制三相电机的
- >> 读书记录_2015~2020
- 魅族mx4pro刷linux,老树开新花 魅族MX4 Pro刷Flyme 5体验
- 网站接入QQ登录功能的实现
- 常用web服务器架构理解
- 81192!请返航!
- 数据库银行业务基础知识
热门文章
- 苹果新iPhone未见踪影,三星Galaxy Note9已经抢跑
- dnf剑魂buff等级上限_DNF:超时空最垃圾的几个职业,剑魂榜上有名,第一炸团必有他...
- Ant中build.xml对多module部署配置
- 在页面实现qq跳转链接
- 【ybtoj 高效进阶 1.5】【广搜】 荆轲刺秦王
- app内执行apk安装报错:exposed beyond app through Intent.getData()
- C语言与汉语结构类比理解入门之指针
- vue 后台登录滑动验证
- 王振2020-5-29笔记
- H3C AC:如何通过Web平台进行AC软件的升级?