Redis實(shí)現(xiàn)每日簽到功能(大數(shù)據(jù)量)
PHP語言使用Redis NoSQL服務(wù)器二進(jìn)制數(shù)據(jù)類型實(shí)現(xiàn)大數(shù)據(jù)情況下簽到功能
問題
實(shí)現(xiàn)用戶每日簽到功能不難,但隨著用戶量上升之后,不論是存儲(chǔ)還是判斷對數(shù)據(jù)量來說都很麻煩;假如每天有100萬用戶簽到,如何存儲(chǔ)、判斷簽到和顯示每月簽到記錄。
解決方式
通過Redis 二進(jìn)制數(shù)據(jù)實(shí)現(xiàn)簽到。
封裝簽到類
在其中將redis的鏈接、儲(chǔ)存、查詢等操作進(jìn)行封裝,提供簽到、補(bǔ)簽、查看當(dāng)月簽到記錄等功能接口。
具體代碼如下:
<?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服務(wù)器地址
$port = 6379; // Redis端口號(hào),默認(rèn)是6379
$timeout = 0; // 連接超時(shí)時(shí)間(可選,默認(rèn)為0,代表無超時(shí),單位秒)
$redis->connect($host, $port, $timeout);
return $redis;
}
/**
* 進(jìn)行簽到
* @return bool
*/
public function addDay()
{
// 判斷今日是否簽到
$nowD = date('d');
$isSign = $this->isSign($nowD-1);
if (!in_array($isSign, ['0', '1'], true)) {
// 進(jìn)行簽到
return $this->link->append(self::$signList, '1');
}
return true;
}
/**
* 獲取簽到列表
* @return string
*/
public function getDayList()
{
return $this->link->getRange(self::$signList, 0, -1);
}
/**
* 對指定日期進(jìn)行補(bǔ)簽
* @param string $d
* @return bool|int
*/
public function repairDay(string $d)
{
$nowDay = date('d');
if ($nowDay == $d) {
return $this->addDay();
}
// 判斷補(bǔ)簽日期是否已簽到
$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();
}
}功能調(diào)用
在實(shí)例化后,調(diào)用當(dāng)日簽到,補(bǔ)簽本月6號(hào)的記錄,之后查詢本月簽到記錄。
示例如下:
<?php
require_once './Sign.php';
$obj = new Sign();
// 簽到
$info = $obj->addDay();
// 補(bǔ)簽 本月6號(hào)的記錄
$info = $obj->repairDay('6');
// 獲取簽到列表
$dayList = $obj->getDayList();
print_r(str_split($dayList, 1));運(yùn)行結(jié)果:

總結(jié)
PHP語言使用Redis NoSQL服務(wù)器二進(jìn)制數(shù)據(jù)類型實(shí)現(xiàn)大數(shù)據(jù)情況下簽到功能。
到此這篇關(guān)于Redis實(shí)現(xiàn)每日簽到(大數(shù)據(jù)量)的文章就介紹到這了,更多相關(guān)Redis每日簽到內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis應(yīng)用之簽到的使用
- SpringBoot+Redis?BitMap實(shí)現(xiàn)簽到與統(tǒng)計(jì)的項(xiàng)目實(shí)踐
- PHP利用redis位圖實(shí)現(xiàn)簡單的簽到功能
- 微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能
- Redis基于Bitmap實(shí)現(xiàn)用戶簽到功能
- 基于Redis位圖實(shí)現(xiàn)用戶簽到功能
- java redis 實(shí)現(xiàn)簡單的用戶簽到功能
- PHP使用redis位圖bitMap 實(shí)現(xiàn)簽到功能
相關(guān)文章
Redis實(shí)現(xiàn)附近商鋪的項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了Redis實(shí)現(xiàn)附近商鋪的項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
redis 替代php文件存儲(chǔ)session的實(shí)例
這篇文章主要介紹了redis 替代php文件存儲(chǔ)session的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下2017-10-10
詳解Redis BoundValueOperations使用及實(shí)現(xiàn)
BoundValueOperations是Spring Data Redis中一個(gè)非常實(shí)用的工具,本文主要介紹了Redis BoundValueOperations使用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-09-09
Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)的配置步驟
這篇文章主要介紹了Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)詳細(xì)教程,配置步驟需要先下載redistimeseries.so 文件,文中介紹了啟動(dòng)失敗問題排查,需要的朋友可以參考下2024-01-01

