王海鱼 发表于 2024-10-8 15:59:21

Redis实现逐日签到(大数据量)

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)); 运行结果:
https://i-blog.csdnimg.cn/direct/abe80cd10793486dbda9aa0ceb3ceba6.png

总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Redis实现逐日签到(大数据量)