Redis實(shí)現(xiàn)每日簽到功能(大數(shù)據(jù)量)
PHP語(yǔ)言使用Redis NoSQL服務(wù)器二進(jìn)制數(shù)據(jù)類型實(shí)現(xiàn)大數(shù)據(jù)情況下簽到功能
問(wèn)題
實(shí)現(xiàn)用戶每日簽到功能不難,但隨著用戶量上升之后,不論是存儲(chǔ)還是判斷對(duì)數(shù)據(jù)量來(lái)說(shuō)都很麻煩;假如每天有100萬(wàn)用戶簽到,如何存儲(chǔ)、判斷簽到和顯示每月簽到記錄。
解決方式
通過(guò)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,代表無(wú)超時(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); } /** * 對(duì)指定日期進(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語(yǔ)言使用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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis應(yīng)用之簽到的使用
- SpringBoot+Redis?BitMap實(shí)現(xiàn)簽到與統(tǒng)計(jì)的項(xiàng)目實(shí)踐
- PHP利用redis位圖實(shí)現(xiàn)簡(jiǎ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)簡(jiǎn)單的用戶簽到功能
- PHP使用redis位圖bitMap 實(shí)現(xiàn)簽到功能
相關(guān)文章
Redis+Lua腳本實(shí)現(xiàn)計(jì)數(shù)器接口防刷功能(升級(jí)版)
這篇文章主要介紹了Redis+Lua腳本實(shí)現(xiàn)計(jì)數(shù)器接口防刷功能,使用腳本使得set命令和expire命令一同達(dá)到Redis被執(zhí)行且不會(huì)被干擾,在很大程度上保證了原子操作,對(duì)Redis實(shí)現(xiàn)計(jì)數(shù)器接口防刷功能感興趣的朋友一起看看吧2022-02-02redis通過(guò)位圖法記錄在線用戶的狀態(tài)詳解
這篇文章主要給大家介紹了關(guān)于redis如何通過(guò)位圖法記錄在線用戶的狀態(tài)的相關(guān)資料,文中先對(duì)位圖進(jìn)行了一個(gè)簡(jiǎn)單的介紹,而后通過(guò)示例代碼將實(shí)現(xiàn)的方法介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問(wèn)題及解決
這篇文章主要介紹了redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07使用Redis獲取數(shù)據(jù)轉(zhuǎn)json,解決動(dòng)態(tài)泛型傳參的問(wèn)題
這篇文章主要介紹了使用Redis獲取數(shù)據(jù)轉(zhuǎn)json,解決動(dòng)態(tài)泛型傳參的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08