Redis实现每日签到功能(大数据量)
短信预约 -IT技能 免费直播动态提醒
php语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能
问题
实现用户每日签到功能不难,但随着用户量上升之后,不论是存储还是判断对数据量来说都很麻烦;假如每天有100万用户签到,如何存储、判断签到和显示每月签到记录。
解决方式
通过Redis 二进制数据实现签到。
封装签到类
在其中将redis的链接、储存、查询等操作进行封装,提供签到、补签、查看当月签到记录等功能接口。
具体代码如下:
<?php
class Sign
{
private $link;
private static $signList = 'signDay';
public function __construct()
{
$this->link = $this->connect();
}
private function connect()
{
$redis = new \Redis();
$host = '127.0.0.1'; // Redis服务器地址
$port = 6379; // Redis端口号,默认是6379
$timeout = 0; // 连接超时时间(可选,默认为0,代表无超时,单位秒)
$redis->connect($host, $port, $timeout);
return $redis;
}
public function addDay()
{
// 判断今日是否签到
$nowD = date('d');
$isSign = $this->isSign($nowD-1);
if (!in_array($isSign, ['0', '1'], true)) {
// 进行签到
return $this->link->append(self::$signList, '1');
}
return true;
}
public function getDayList()
{
return $this->link->getRange(self::$signList, 0, -1);
}
public function repairDay(string $d)
{
$nowDay = date('d');
if ($nowDay == $d) {
return $this->addDay();
}
// 判断补签日期是否已签到
$offset = $d - 1;
if ($this->isSign($offset)) {
return true;
}
return $this->link->setRange(self::$signList, $offset, 1);
}
private function isSign($offset)
{
return $this->link->getRange(self::$signList, $offset, $offset);
}
public function __destruct()
{
$this->link->close();
}
}
功能调用
在实例化后,调用当日签到,补签本月6号的记录,之后查询本月签到记录。
示例如下:
<?php
require_once './Sign.php';
$obj = new Sign();
// 签到
$info = $obj->addDay();
// 补签 本月6号的记录
$info = $obj->repairDay('6');
// 获取签到列表
$dayList = $obj->getDayList();
print_r(str_split($dayList, 1));
运行结果:
总结
PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能。
到此这篇关于Redis实现每日签到(大数据量)的文章就介绍到这了,更多相关Redis每日签到内容请搜索编程网(www.lsjlt.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网(www.lsjlt.com)!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341