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;
- }
- /**
- * 进行签到
- * @return bool
- */
- 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;
- }
- /**
- * 获取签到列表
- * @return string
- */
- public function getDayList()
- {
- return $this->link->getRange(self::$signList, 0, -1);
- }
- /**
- * 对指定日期进行补签
- * @param string $d
- * @return bool|int
- */
- 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);
- }
- /**
- * 是否签到
- * @param $offset:偏移量
- * @return string
- */
- 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服务器二进制数据类型实现大数据环境下签到功能。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |