当前位置: 首页 > article >正文

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));

运行结果:

总结

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


http://www.kler.cn/news/335183.html

相关文章:

  • EXCEL图片链接快速批量转成图片
  • Go基础学习09-多协程资源竞争、sync.Mutex、sync.Cond、chan在多协程对共享变量的资源竞争中的使用
  • C程序设计——简单说说编程风格0
  • 基于 STM32F407 的 SPI Flash下载算法
  • 基于微信小程序医院应急设备管理系统(源码+定制+解答)
  • 谷歌地图 | 3D 地图新功能:开发更简单,体验更丰富
  • C++ 语言特性29 - 协程介绍
  • 每日一刷——9.26——ACM训练题——Fibonacci Again
  • 吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
  • 暴力数据结构——AVL树
  • 【漏洞复现】泛微OA E-Office /E-mobile/App/init.php 任意文件上传漏洞
  • 云栖大会观察:云计算第三次浪潮下的暗流涌动
  • 智能家居有哪些产品?生活中常见的人工智能有哪些?
  • videojs 播放监控
  • STAR数据集:首个用于大型卫星图像中场景图生成大规模数据集
  • IDEA 2024将Java项目(module)打成JAR包
  • 使用TensorBoard可视化模型
  • sublime配置(竞赛向)
  • 【动态规划-最长公共子序列(LCS)】力扣1035. 不相交的线
  • 通达信盯盘接口在美股适用吗