ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis实现逐日签到(大数据量) [打印本页]

作者: 王海鱼    时间: 2024-10-8 15:59
标题: Redis实现逐日签到(大数据量)
PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据环境下签到功能
  目次
问题
解决方式
封装签到类
功能调用
总结


问题

实现用户逐日签到功能不难,但随着用户量上升之后,不论是存储还是判定对数据量来说都很麻烦;假如每天有100万用户签到,如何存储、判定签到和体现每月签到记载。

解决方式

通过Redis 二进制数据实现签到。

封装签到类

在其中将redis的链接、储存、查询等操作举行封装,提供签到、补签、检察当月签到记载等功能接口。
详细代码如下:
  1. <?php
  2. class Sign
  3. {
  4.     private $link;
  5.     private static $signList = 'signDay';
  6.     public function __construct()
  7.     {
  8.         $this->link = $this->connect();
  9.     }
  10.     private function connect()
  11.     {
  12.         $redis = new \Redis();
  13.         $host = '127.0.0.1'; // Redis服务器地址
  14.         $port = 6379;        // Redis端口号,默认是6379
  15.         $timeout = 0;        // 连接超时时间(可选,默认为0,代表无超时,单位秒)
  16.         $redis->connect($host, $port, $timeout);
  17.         return $redis;
  18.     }
  19.     /**
  20.      * 进行签到
  21.      * @return bool
  22.      */
  23.     public function addDay()
  24.     {
  25.         // 判断今日是否签到
  26.         $nowD = date('d');
  27.         $isSign = $this->isSign($nowD-1);
  28.         if (!in_array($isSign, ['0', '1'], true)) {
  29.             // 进行签到
  30.             return $this->link->append(self::$signList, '1');
  31.         }
  32.         return true;
  33.     }
  34.     /**
  35.      * 获取签到列表
  36.      * @return string
  37.      */
  38.     public function getDayList()
  39.     {
  40.         return $this->link->getRange(self::$signList, 0, -1);
  41.     }
  42.     /**
  43.      * 对指定日期进行补签
  44.      * @param string $d
  45.      * @return bool|int
  46.      */
  47.     public function repairDay(string $d)
  48.     {
  49.         $nowDay = date('d');
  50.         if ($nowDay == $d) {
  51.             return $this->addDay();
  52.         }
  53.         // 判断补签日期是否已签到
  54.         $offset = $d - 1;
  55.         if ($this->isSign($offset)) {
  56.             return true;
  57.         }
  58.         return $this->link->setRange(self::$signList, $offset, 1);
  59.     }
  60.     /**
  61.      * 是否签到
  62.      * @param $offset:偏移量
  63.      * @return string
  64.      */
  65.     private function isSign($offset)
  66.     {
  67.         return $this->link->getRange(self::$signList, $offset, $offset);
  68.     }
  69.     public function __destruct()
  70.     {
  71.         $this->link->close();
  72.     }
  73. }
复制代码
 
功能调用

在实例化后,调用当日签到,补签本月6号的记载,之后查询本月签到记载。
示例如下:
  1. <?php
  2. require_once './Sign.php';
  3. $obj = new Sign();
  4. // 签到
  5. $info = $obj->addDay();
  6. // 补签 本月6号的记录
  7. $info = $obj->repairDay('6');
  8. // 获取签到列表
  9. $dayList = $obj->getDayList();
  10. print_r(str_split($dayList, 1));
复制代码
运行结果:


总结

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据环境下签到功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4