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

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

目录

问题

解决方式

封装签到类

功能调用

总结


问题

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

解决方式

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

封装签到类

在其中将redis的链接、储存、查询等操作进行封装,提供签到、补签、查看当月签到记录等功能接口。

具体代码如下:

php 复制代码
<?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 复制代码
<?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服务器二进制数据类型实现大数据情况下签到功能。

相关推荐
程序员爱钓鱼22 分钟前
为什么学习 Rust?Rust 能做什么?
后端·rust
掘金者阿豪1 小时前
Docker命令太多记不住?用Portainer把容器管理变成可视化操作
后端
用户69371750013842 小时前
AI Agent 里的 Loop 到底是什么?
android·前端·后端
Rain的Java大神之路2 小时前
高并发下的抢优惠券如何设计
后端
无小道2 小时前
Redis——集群
redis·集群
钟智强2 小时前
AWS CloudGoat 实战:一个 SSRF 如何撬动整个云账户
后端
Ai拆代码的曹操2 小时前
@Transactional 写在 private 方法上,事务根本没生效
后端
云技纵横2 小时前
@Async 默认执行器又炸了:SimpleAsyncTaskExecutor 为什么不是线程池?
后端·面试
程序员Agions2 小时前
Fypro 新手快速上手与实战指南
后端
舒心的云朵2 小时前
用三张图片详解Asp.Net 全生命周期
后端·asp.net