最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis+PHP實(shí)現(xiàn)用戶(hù)消息推送每天最多通知2次的功能

 更新時(shí)間:2023年10月09日 10:14:13   作者:黑夜開(kāi)發(fā)者  
在開(kāi)發(fā)應(yīng)用程序中,經(jīng)常需要向用戶(hù)推送消息通知,但是為了避免過(guò)多的打擾用戶(hù),我們希望限制每天最多通知2次,本篇博文將介紹如何使用PHP和Redis實(shí)現(xiàn)這一功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

一、背景

在開(kāi)發(fā)應(yīng)用程序中,經(jīng)常需要向用戶(hù)推送消息通知,但是為了避免過(guò)多的打擾用戶(hù),我們希望限制每天最多通知2次。本文將介紹如何使用 PHP 和 Redis 實(shí)現(xiàn)這一功能。

二、準(zhǔn)備工作

首先,我們需要準(zhǔn)備好數(shù)據(jù)庫(kù)和 Redis 服務(wù)。在 MySQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè) user_notifications 表, 包含以下字段:

  • id:主鍵自增長(zhǎng)ID
  • user_id:用戶(hù)ID
  • content:通知內(nèi)容
  • created_at:記錄創(chuàng)建時(shí)間

此外,還需要安裝 Redis 擴(kuò)展,在 PHP 中可以通過(guò)以下命令安裝:

$ pecl install redis

常見(jiàn)的推送消息場(chǎng)景如下圖。

三、實(shí)現(xiàn)邏輯

3.1 查詢(xún)用戶(hù)的已發(fā)送通知數(shù)量

在用戶(hù)登錄或接收新通知時(shí),我們需要查詢(xún)用戶(hù)今天已發(fā)送的通知數(shù)量。我們可以利用 Redis 的 Sorted Set 數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)每個(gè)用戶(hù)的通知記錄。將用戶(hù)ID作為 Sorted Set 的 key,通知的發(fā)送時(shí)間戳作為 score 值,這樣就可以按照時(shí)間順序存儲(chǔ)用戶(hù)的通知記錄。

使用以下代碼實(shí)現(xiàn)查詢(xún)用戶(hù)已發(fā)送通知數(shù)量的函數(shù):

function getNotificationCount($userId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $todayStart = strtotime('today'); // 當(dāng)天開(kāi)始的時(shí)間戳
    $todayEnd = strtotime('tomorrow') - 1; // 當(dāng)天結(jié)束的時(shí)間戳
    $count = $redis->zcount('user_notifications:' . $userId, $todayStart, $todayEnd);
    return $count;
}

3.2 發(fā)送通知

在發(fā)送通知之前,先檢查用戶(hù)已發(fā)送通知數(shù)量是否達(dá)到限制。如果已發(fā)送通知數(shù)量大于等于2,則不再發(fā)送新通知;否則,保存通知記錄到數(shù)據(jù)庫(kù),并將通知記錄的發(fā)送時(shí)間戳添加到 Redis Sorted Set 中。

使用以下代碼實(shí)現(xiàn)發(fā)送通知的函數(shù):

function sendNotification($userId, $content) {
    // 檢查用戶(hù)已發(fā)送通知數(shù)量
    $count = getNotificationCount($userId);
    if ($count >= 2) {
        return false;
    }
    // 保存通知記錄到數(shù)據(jù)庫(kù)
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $pdo->prepare("INSERT INTO user_notifications (user_id, content, created_at) VALUES (?, ?, NOW())");
    $stmt->execute([$userId, $content]);
    // 將通知記錄的發(fā)送時(shí)間戳添加到 Redis Sorted Set
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->zadd('user_notifications:' . $userId, time(), $content);
    return true;
}

3.3 獲取用戶(hù)通知列表

用戶(hù)可以通過(guò)接口或頁(yè)面查看自己的通知列表。我們可以從數(shù)據(jù)庫(kù)中查詢(xún)用戶(hù)的通知記錄,并按照發(fā)送時(shí)間倒序排列。

使用以下代碼實(shí)現(xiàn)獲取用戶(hù)通知列表的函數(shù):

function getNotificationList($userId) {
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $pdo->prepare("SELECT * FROM user_notifications WHERE user_id = ? ORDER BY created_at DESC");
    $stmt->execute([$userId]);
    $notifications = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $notifications;
}

3.4 清理過(guò)期通知記錄

為了避免 Redis Sorted Set 中存儲(chǔ)的用戶(hù)通知記錄過(guò)多,我們可以定時(shí)清理過(guò)期的通知記錄。通過(guò)設(shè)置 Redis 的過(guò)期時(shí)間來(lái)實(shí)現(xiàn)自動(dòng)清理。例如,我們可以設(shè)置 Sorted Set 的過(guò)期時(shí)間為2天,在用戶(hù)查詢(xún)通知列表時(shí),先刪除過(guò)期的通知記錄,再返回有效的通知列表。

function cleanExpiredNotifications($userId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    // 設(shè)置 Sorted Set 的過(guò)期時(shí)間為2天
    $expireTime = strtotime('2 days ago');
    $redis->expireAt('user_notifications:' . $userId, $expireTime);
}

3.5 定時(shí)任務(wù)

為了每天凌晨清理用戶(hù)的通知記錄,我們可以使用 Linux 的 crontab 來(lái)定時(shí)執(zhí)行清理任務(wù)。編輯 crontab 文件,添加如下代碼:

0 0 * * * php /path/to/clean_expired_notifications.php

并創(chuàng)建 clean_expired_notifications.php 文件,內(nèi)容如下:

<?php
require_once 'redis.php';
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT DISTINCT user_id FROM user_notifications");
$stmt->execute();
$userIds = $stmt->fetchAll(PDO::FETCH_COLUMN);
foreach ($userIds as $userId) {
    cleanExpiredNotifications($userId);
}

四、結(jié)語(yǔ)

通過(guò) PHP 和 Redis 實(shí)現(xiàn)用戶(hù)消息推送每天最多通知2次的功能,并結(jié)合定時(shí)任務(wù)清理過(guò)期通知記錄,可以有效地避免過(guò)多地打擾用戶(hù)。以上是基本實(shí)現(xiàn)邏輯和代碼示例,你可以根據(jù)自己的實(shí)際需求進(jìn)行修改和擴(kuò)展,例如根據(jù)不同用戶(hù)設(shè)置不同的通知限制次數(shù)等。

以上就是Redis+PHP實(shí)現(xiàn)用戶(hù)消息推送每天最多通知2次的功能的詳細(xì)內(nèi)容,更多關(guān)于Redis實(shí)現(xiàn)用戶(hù)消息推送的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis Sorted Set 跳表的實(shí)現(xiàn)示例

    Redis Sorted Set 跳表的實(shí)現(xiàn)示例

    本文詳細(xì)解析了Redis中SortedSet跳表的實(shí)現(xiàn)原理,闡述了跳表的基本概念、結(jié)構(gòu)及其在SortedSet中的應(yīng)用,同時(shí)也指出了跳表在實(shí)際使用中的優(yōu)勢(shì)和局限,可以更好地運(yùn)用Redis的SortedSet,優(yōu)化高并發(fā)環(huán)境中的數(shù)據(jù)查詢(xún)與操作,感興趣的可以了解一下
    2024-10-10
  • Redis Cluster 集群搭建你會(huì)嗎

    Redis Cluster 集群搭建你會(huì)嗎

    這篇文章主要介紹了Redis Cluster 集群搭建過(guò)程,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • redis過(guò)期監(jiān)聽(tīng)機(jī)制方式

    redis過(guò)期監(jiān)聽(tīng)機(jī)制方式

    這篇文章主要介紹了redis過(guò)期監(jiān)聽(tīng)機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 關(guān)于Redis解決Session共享問(wèn)題

    關(guān)于Redis解決Session共享問(wèn)題

    這篇文章主要介紹了Redis解決Session共享問(wèn)題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 深入理解redis中multi與pipeline

    深入理解redis中multi與pipeline

    pipeline 只是把多個(gè)redis指令一起發(fā)出去,redis并沒(méi)有保證這些指定的執(zhí)行是原子的;multi相當(dāng)于一個(gè)redis的transaction的,保證整個(gè)操作的原子性,避免由于中途出錯(cuò)而導(dǎo)致最后產(chǎn)生的數(shù)據(jù)不一致。本文詳細(xì)的介紹,感興趣的可以了解一下
    2021-06-06
  • Redis在Ubuntu系統(tǒng)上無(wú)法啟動(dòng)的問(wèn)題排查

    Redis在Ubuntu系統(tǒng)上無(wú)法啟動(dòng)的問(wèn)題排查

    這篇文章主要介紹了Redis在Ubuntu系統(tǒng)上無(wú)法啟動(dòng)的問(wèn)題排查,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Redis 主從搭建的實(shí)現(xiàn)(同主機(jī)和跨節(jié)點(diǎn))

    Redis 主從搭建的實(shí)現(xiàn)(同主機(jī)和跨節(jié)點(diǎn))

    本文主要介紹了Redis 主從搭建的實(shí)現(xiàn),包括同主機(jī)和跨節(jié)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • redis4.0入門(mén)小結(jié)

    redis4.0入門(mén)小結(jié)

    這篇文章主要介紹了redis4.0入門(mén)小結(jié),文中通過(guò)示例和概念介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • RedisTemplate中boundHashOps的使用小結(jié)

    RedisTemplate中boundHashOps的使用小結(jié)

    redisTemplate.boundHashOps(key)?是 RedisTemplate 類(lèi)的一個(gè)方法,本文主要介紹了RedisTemplate中boundHashOps的使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Redis 事務(wù)與過(guò)期時(shí)間詳細(xì)介紹

    Redis 事務(wù)與過(guò)期時(shí)間詳細(xì)介紹

    這篇文章主要介紹了Redis 事務(wù)與過(guò)期時(shí)間詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論

平顶山市| 乐都县| 财经| 肇东市| 惠东县| 南岸区| 集安市| 甘洛县| 凉城县| 海口市| 乌恰县| 宁阳县| 大足县| 于田县| 专栏| 蒙阴县| 新龙县| 木兰县| 沭阳县| 镇沅| 四子王旗| 莆田市| 乳山市| 吉水县| 许昌县| 商丘市| 蓬莱市| 大悟县| 安丘市| 安达市| 木兰县| 苏尼特左旗| 祁连县| 德格县| 嵊州市| 监利县| 霍林郭勒市| 寿阳县| 华蓥市| 罗江县| 铜山县|