Redis限流实践:实现用户消息推送每天最多通知2次的功能

这篇具有很好参考价值的文章主要介绍了Redis限流实践:实现用户消息推送每天最多通知2次的功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis限流实践:实现用户消息推送每天最多通知2次的功能,PHP进阶实战教程🔥,redis,数据库,消息推送,PHP,编程语言,原力计划

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🏆本文已收录于PHP专栏:PHP进阶实战教程。
🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。
🎉欢迎 👍点赞✍评论⭐收藏


🚀一、背景

在开发应用程序中,经常需要向用户推送消息通知,但是为了避免过多的打扰用户,我们希望限制每天最多通知2次。本篇博文将介绍如何使用 PHP 和 Redis 实现这一功能。

Redis限流实践:实现用户消息推送每天最多通知2次的功能,PHP进阶实战教程🔥,redis,数据库,消息推送,PHP,编程语言,原力计划

🚀二、准备工作

首先,我们需要准备好数据库和 Redis 服务。在 MySQL 数据库中创建一个 user_notifications 表, 包含以下字段:

  • id:主键自增长ID
  • user_id:用户ID
  • content:通知内容
  • created_at:记录创建时间

此外,还需要安装 Redis 扩展,在 PHP 中可以通过以下命令安装:

$ pecl install redis

常见的推送消息场景如下图。

Redis限流实践:实现用户消息推送每天最多通知2次的功能,PHP进阶实战教程🔥,redis,数据库,消息推送,PHP,编程语言,原力计划

🚀三、实现逻辑

🔎3.1 查询用户的已发送通知数量

在用户登录或接收新通知时,我们需要查询用户今天已发送的通知数量。我们可以利用 Redis 的 Sorted Set 数据结构来存储每个用户的通知记录。将用户ID作为 Sorted Set 的 key,通知的发送时间戳作为 score 值,这样就可以按照时间顺序存储用户的通知记录。

使用以下代码实现查询用户已发送通知数量的函数:

function getNotificationCount($userId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    $todayStart = strtotime('today'); // 当天开始的时间戳
    $todayEnd = strtotime('tomorrow') - 1; // 当天结束的时间戳

    $count = $redis->zcount('user_notifications:' . $userId, $todayStart, $todayEnd);

    return $count;
}

🔎3.2 发送通知

在发送通知之前,先检查用户已发送通知数量是否达到限制。如果已发送通知数量大于等于2,则不再发送新通知;否则,保存通知记录到数据库,并将通知记录的发送时间戳添加到 Redis Sorted Set 中。

使用以下代码实现发送通知的函数:

function sendNotification($userId, $content) {
    // 检查用户已发送通知数量
    $count = getNotificationCount($userId);
    if ($count >= 2) {
        return false;
    }

    // 保存通知记录到数据库
    $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]);

    // 将通知记录的发送时间戳添加到 Redis Sorted Set
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $redis->zadd('user_notifications:' . $userId, time(), $content);

    return true;
}

🔎3.3 获取用户通知列表

用户可以通过接口或页面查看自己的通知列表。我们可以从数据库中查询用户的通知记录,并按照发送时间倒序排列。

使用以下代码实现获取用户通知列表的函数:

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 清理过期通知记录

为了避免 Redis Sorted Set 中存储的用户通知记录过多,我们可以定时清理过期的通知记录。通过设置 Redis 的过期时间来实现自动清理。例如,我们可以设置 Sorted Set 的过期时间为2天,在用户查询通知列表时,先删除过期的通知记录,再返回有效的通知列表。

function cleanExpiredNotifications($userId) {
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);

    // 设置 Sorted Set 的过期时间为2天
    $expireTime = strtotime('2 days ago');
    $redis->expireAt('user_notifications:' . $userId, $expireTime);
}

🔎3.5 定时任务

为了每天凌晨清理用户的通知记录,我们可以使用 Linux 的 crontab 来定时执行清理任务。编辑 crontab 文件,添加如下代码:

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

并创建 clean_expired_notifications.php 文件,内容如下:

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

🚀四、结语

通过 PHP 和 Redis 实现用户消息推送每天最多通知2次的功能,并结合定时任务清理过期通知记录,可以有效地避免过多地打扰用户。以上是基本实现逻辑和代码示例,你可以根据自己的实际需求进行修改和扩展,例如根据不同用户设置不同的通知限制次数等。

Redis限流实践:实现用户消息推送每天最多通知2次的功能,PHP进阶实战教程🔥,redis,数据库,消息推送,PHP,编程语言,原力计划

推荐您阅读本专栏其他内容,PHP进阶实战教程,相信不会让您失望。如果你对上面的功能有疑问,随时欢迎与我交流。文章来源地址https://www.toymoban.com/news/detail-701147.html

到了这里,关于Redis限流实践:实现用户消息推送每天最多通知2次的功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合调用微信模板方法实现微信公众号消息通知推送,Java实现微信公众号给关注用户推送自定义消息通知(手把手从0到1)

    目录 概述 公众号给关注用户推送自定义消息 一、申请公众号模板消息 二、获取安装“web开发者工具” 三、微信网页授权说明 四、微信网页授权 - 流程时序图 五、HTTPClient 实现微信公众号消息推送与发布(四步走) 六、通过weixin-java-mp SDK实现微信公众号消息推送与发布(七

    2024年02月10日
    浏览(42)
  • spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

    用户登录小程序,后台记录用户的小程序openId和用户唯一的UnionId。然后用户触发公众号事件(关注公众号或者发送指定消息),后台获取到用户公众号的openId,再调用接口通过公众号的openId查询用户的UnionId,再和数据库里的UnionId进行匹配,将用户的公众号openId存入数据库。此

    2024年02月03日
    浏览(57)
  • 手把手教你实现微信小程序向特定用户推送一次性订阅消息

    目前有一个已 微信认证 的 订阅号 类型公众号,一个 微信认证 小程序,小程序和公众号互相关联。尚不清楚是否必须微信认证或特定类型,因为目前没遇到类型不匹配或相关的问题,发送微信小程序一次性订阅消息的相关限制较少 1、功能介绍 订阅消息推送位置:服务通知

    2024年02月08日
    浏览(52)
  • 基于Redis实现消息队列的实践

    消息队列是一种典型的发布/订阅模式,是专门为异步化应用和分布式系统设计的,具有高性能、稳定性及可伸缩性的特点,是开发分布式系统和应用系统必备的技术之一。目前,针对不同的业务场景,比较成熟可靠的消息中间件产品有RocketMQ、Kafka、RabbitMq等,基于Redis再去实

    2024年02月07日
    浏览(31)
  • 微信公众号推送模板消息给用户

    前置条件: 1.公众号为服务号,而非订阅号 2.认证(300元) 3.进入公众号申请模板推送功能 4.添加模板(注意:推送的消息只能使用微信提供的模板,不可自定义,但也是比较全的) 4.2 获取accessToken时,需要将开发环境的电脑ip添加到微信后台的ip白名单(线上环境亦是如此

    2024年02月12日
    浏览(56)
  • SpringBoot使用Redis对用户IP进行接口限流

    使用接口限流的主要目的在于提高系统的稳定性,防止接口被恶意打击(短时间内大量请求)。 一、创建限流注解 引入redis依赖 创建一个自定义限流注解  二、定义lua脚本 在 resources/lua 下新建 limit.lua : 三、注入Lua执行脚本 四、定义Aop切面 先定义一个获取IP地址的工具类

    2024年02月15日
    浏览(40)
  • SpringBoot 项目使用 Redis 对用户IP进行接口限流

    本文主要参考了该篇文章:https://www.zhihu.com/question/586213782/answer/3038040317?utm_id=0 使用接口限流的主要目的在于提高系统的稳定性,防止接口被恶意打击(短时间内大量请求)。 比如要求 某接口 在 1分钟 内请求次数不超过 1000次 ,那么应该如何设计代码呢? 下面讲两种思路,

    2024年02月16日
    浏览(53)
  • SpringBoot 项目使用 Redis 对用户 IP 进行接口限流

    使用接口限流的主要目的在于提高系统的稳定性,防止接口被恶意打击(短时间内大量请求)。 比如要求某接口在1分钟内请求次数不超过1000次,那么应该如何设计代码呢? 下面讲两种思路,如果想看代码可直接翻到后面的代码部分。 1.1 固定时间段(旧思路) 1.1.1 思路描述

    2024年02月15日
    浏览(53)
  • 极光笔记|极光消息推送服务的云原生实践

    极光始终秉承“以开发者为中心”的战略导向 ,极光推送(JPush)是国内领先的消息推送服务。极光推送(JPush)本质上是一种软件付费应用程序,结合当前主流云厂商基础施设,逐渐演进成了云上SaaS服务。作为SaaS服务,必然要考虑云原生架构。因此,在极光推送(JPush)日

    2024年03月25日
    浏览(41)
  • uniapp小程序如何给用户推送订阅消息? 及订阅消息参数值内容限制规则

    uniapp小程序如何订阅消息,给用户推送消息? 小程序的模板推送分为“一次性订阅”和“长期订阅” 一次性订阅:用户订阅小程序后,程序只能对指定OpenId进行一次推送模板消息,无法多次推送 长期订阅:用户长期订阅,能够多次推送模板消息(长期订阅模板需要向微信官方

    2023年04月08日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包