​Redis 实现计数器和限速器的

news2024/12/22 14:38:48

Redis 是一个非常适合实现计数器和限速器的工具,因为它提供了高效的原子性操作,如自增、自减等。以下是如何使用 Redis 实现计数器和限速器的详细示例。

1. 使用 Redis 实现计数器

计数器通常用于统计某个事件发生的次数,如用户点赞数、页面访问次数等。Redis 提供的 INCR 和 INCRBY 命令可以帮助我们轻松实现这个功能。

示例:用户点赞数统计
<?php
class LikeCounter {
    private $redis;

    public function __construct() {
        $this->redis = new Redis();
        $this->redis->connect('127.0.0.1', 6379);
    }

    public function incrementLike($postId) {
        $key = "post_likes:$postId";
        return $this->redis->incr($key);
    }

    public function getLikeCount($postId) {
        $key = "post_likes:$postId";
        return $this->redis->get($key);
    }
}

// 示例用法
$likeCounter = new LikeCounter();
$postId = 123; // 假设这是某个帖子的ID

// 用户对帖子点赞
$newCount = $likeCounter->incrementLike($postId);
echo "Post $postId has $newCount likes.";

// 获取帖子点赞数
$currentLikes = $likeCounter->getLikeCount($postId);
echo "Current like count for post $postId: $currentLikes";

2. 使用 Redis 实现限速器

限速器用于控制某个操作的频率,典型场景包括限制用户访问 API 的频率、抢购系统中防止用户频繁点击等。Redis 的 INCR 和 EXPIRE 结合使用,可以方便地实现这种功能。

示例:限制用户 API 访问频率
<?php
class RateLimiter {
    private $redis;
    private $maxRequests;
    private $timeWindow;

    public function __construct($maxRequests, $timeWindow) {
        $this->redis = new Redis();
        $this->redis->connect('127.0.0.1', 6379);
        $this->maxRequests = $maxRequests;
        $this->timeWindow = $timeWindow;
    }

    public function isAllowed($userId, $apiEndpoint) {
        $key = "rate_limit:$userId:$apiEndpoint";
        $count = $this->redis->incr($key);

        if ($count == 1) {
            // 设置过期时间
            $this->redis->expire($key, $this->timeWindow);
        }

        if ($count > $this->maxRequests) {
            // 超过最大请求次数
            return false;
        }

        return true;
    }
}

// 示例用法:每分钟最多允许用户访问API 10次
$rateLimiter = new RateLimiter(10, 60); // 10次请求,时间窗口60秒

$userId = 123; // 假设这是某个用户的ID
$apiEndpoint = "/api/buy"; // API 端点

if ($rateLimiter->isAllowed($userId, $apiEndpoint)) {
    echo "Request allowed.";
    // 执行API操作
} else {
    echo "Too many requests. Please try again later.";
    // 拒绝请求
}

优点

  1. 高效性:Redis 的原子操作确保了在高并发环境下的安全性,不会出现竞态条件。
  2. 可扩展性:可以轻松扩展到多个服务器,以支持更大规模的用户和操作量。
  3. 简单性:通过 Redis 的 INCR 和 EXPIRE 命令,能够轻松实现复杂的计数和限速逻辑。

总结

通过 Redis 实现计数器和限速器,不仅提高了系统的性能,还减少了对数据库的压力,特别是在高并发场景下,比如抢购、点赞等操作。

举例短信限制发送

限制短信发送频率是一种常见的防止滥用和避免用户被骚扰的机制。通过 Redis 实现这一功能,可以有效控制同一个用户在特定时间内发送短信的次数。

实现思路

我们可以基于 Redis 的计数器和过期时间功能来实现限制短信发送频率的功能。具体步骤如下:

  1. 创建一个唯一的 Redis Key:该 Key 可以包含用户的 ID 和短信类型(例如验证码)。
  2. 使用 Redis 的 INCR 命令递增计数器:每次用户请求发送短信时,递增计数器。
  3. 设置过期时间:如果这是计数器的第一次递增操作,为该 Key 设置一个过期时间(例如 60 秒)。
  4. 检查计数器的值:如果计数器的值超过了允许的最大次数,则拒绝发送短信请求。

示例代码

以下是使用 Redis 限制短信发送频率的 PHP 示例代码:

<?php
class SmsRateLimiter {
    private $redis;
    private $maxSmsRequests;
    private $timeWindow;

    public function __construct($maxSmsRequests, $timeWindow) {
        $this->redis = new Redis();
        $this->redis->connect('127.0.0.1', 6379);
        $this->maxSmsRequests = $maxSmsRequests; // 最大允许的短信发送次数
        $this->timeWindow = $timeWindow; // 时间窗口(秒)
    }

    public function canSendSms($userId) {
        $key = "sms_limit:$userId";
        $count = $this->redis->incr($key);

        if ($count == 1) {
            // 第一次操作时,设置过期时间
            $this->redis->expire($key, $this->timeWindow);
        }

        if ($count > $this->maxSmsRequests) {
            // 超过最大允许的发送次数
            return false;
        }

        return true;
    }
}

// 示例用法:限制每个用户每 60 秒最多发送 3 条短信
$smsLimiter = new SmsRateLimiter(3, 60); // 3次请求,时间窗口60秒

$userId = 123; // 假设这是某个用户的ID

if ($smsLimiter->canSendSms($userId)) {
    echo "短信发送成功";
    // 调用发送短信的API
} else {
    echo "发送频率过高,请稍后再试";
    // 拒绝发送短信
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

传染病防控宣传小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;防控知识管理&#xff0c;医院信息管理&#xff0c;健康上报管理&#xff0c;医疗捐赠管理&#xff0c;捐赠信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

力扣面试经典算法150题:买卖股票的最佳时机 II

买卖股票的最佳时机 II 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;买卖股票的最佳时机 II。 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 问…

EfficientFormer 系列算法

1. EfficientFormer V1 模型 论文地址&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/file/5452ad8ee6ea6e7dc41db1cbd31ba0b8-Paper-Conference.pdf EfficientFormer V1 基于 ViT 的模型中使用的网络架构和具体的算子&#xff0c;找到端侧低效的原因。然…

深入剖析资产负债率与净资产收益率,掌握财务报表解读技巧

一、概述 财务报表中蕴含了丰富的信息&#xff0c;如果我们在解读时没有清晰的思路&#xff0c;忽略重点&#xff0c;就很容易被庞杂的数据搞得晕头转向。本文将从几个关键指标出发&#xff0c;包括资产负债率的分析、净资产收益率的解读&#xff0c;以及如何计算销售复合增长…

企业高性能web服务器——nginx

一、web基础介绍 Apache 和 Nginx 是当今为互联网提供动力的最流行的Web 服务器。 1.1、apache服务器 1.1.1、Apache prefork 模型 预派生模式&#xff0c;有一个主控制进程&#xff0c;然后生成多个子进程&#xff0c;使用select模型&#xff0c;最大并发1024每个子进程有一…

萌啦数据ozon怎么用,萌啦数据ozon使用教程

在跨境电商的浩瀚蓝海中&#xff0c;Ozon作为俄罗斯及独联体地区领先的电商平台&#xff0c;正吸引着越来越多中国卖家的目光。而“萌啦数据”作为专为跨境电商卖家打造的数据分析工具&#xff0c;其针对Ozon平台的功能更是让众多商家如虎添翼。今天&#xff0c;我们就来详细探…

后悔和父母出游的年轻人,正在计划带宠物旅行

文 | 螳螂观察 作者 | 青月 美编 |赵倩 相比于和父母一起出门远游&#xff0c;现在越来越多的95后“铲屎官”似乎更愿意和自家的宠物们组“旅游搭子”。 这听起来可能有些刺耳&#xff0c;但其实是当下很多年轻人的心声。 “带父母一起去北京玩&#xff0c;本来打算第二天…

【 每日一题 | 计算机网络】定长子网划分

重要知识点讲解 我们首先需要了解一下无分类CIDR的编址格式x.x.x/24&#xff0c;表示有24位的网路号&#xff0c;那么相应的主机号为32-248位子网掩码&#xff08;很重要&#xff09;&#xff0c;用来表示IP地址中标识网络号以及子网号的&#xff0c;也就是说如果要进行子网划…

鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射

关于中断部分系列篇将用三篇详细说明整个过程. 中断概念篇 中断概念很多&#xff0c;比如中断控制器&#xff0c;中断源&#xff0c;中断向量&#xff0c;中断共享&#xff0c;中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念…

Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时&#xff0c;遇到的错误及处理过程&#xff08;踩坑之旅&#xff09;&#xff01; 一、gozstd简介 gozstd是一个针对Zstandard&#xff08;简称Zstd&#xff09;的Go语言包装器&#xff0c;它提供了简单且高效的API&#xf…

金山云Q2调整后EBITDA率提升至3.2% 高质量发展驱动经营质效双增

8月20日&#xff0c;金山云公布了2024年第二季度业绩。 季度内&#xff0c;金山云整体业绩延续向好态势&#xff0c;实现收入规模、盈利能力、经营现金流的联动共赢。财报显示&#xff0c;金山云Q2营收18.9亿元&#xff0c;公有云实现收入12.3亿元&#xff0c;行业云实现收入6…

The Sandbox 新提案: 2024 年亚洲和拉丁美洲区块链活动预算

理事会建议&#xff1a; 积极 &#x1f642; 内容 此提案请求为2024年第四季度&#xff0c;The Sandbox 在东南亚和拉丁美洲的主要区块链活动中的激活分配 94,500 美元的 SAND 倡议预算。&#xff08;具体活动列表见下方活动描述&#xff09; 原因 区域团队希望在这些现场活…

国际校企合作|深信服、常州信息职业技术学院、马来西亚汽车工业大学三方国际化人才培养合作签约仪式圆满成功

2024年8月19日&#xff0c;深信服科技股份有限公司与常州信息职业技术学院、马来西亚汽车工业大学正式签署了具有里程碑意义的国际校企合作协议。此次签约不仅是“教随产出、校企同行”理念的一次成功实践&#xff0c;更是中马两国友谊与合作的象征。 常州信息职业技术学院党委…

面试题目:(4)给表达式添加运算符

目录 题目 代码 思路解析 例子 题目 题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有能够得到 target 的表达式。1 < num.length &…

【JVM】深入理解类加载机制(一)

深入理解类加载机制 Klass模型 Java的每个类&#xff0c;在JVM中都有一个对应的Klass类实例与之对应&#xff0c;存储类的元信息如:常量池、属性信息、方法信息…从继承关系上也能看出来&#xff0c;类的元信息是存储在元空间的。普通的Java类在JVM中对应的是InstanceKlass(C)…

便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

层次聚类算法原理及Python实现

层次聚类算法&#xff08;Hierarchical Clustering Method&#xff09;是一种基于簇间相似度在不同层次上分析数据&#xff0c;从而形成树形聚类结构的算法。它主要分为两种形式&#xff1a;凝聚层次聚类&#xff08;自下而上&#xff09;和分裂层次聚类&#xff08;自上而下&a…

ansible --------拓展

编辑 hosts 配置文件 [rootmo ~]# vim /etc/ansible/hosts # 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook # 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml # 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/nginx.yml roles 修…

C# asnyc和await

asnyc和await是什么? 异步编程是一种编程范式&#xff0c;C#中的异步编程可以通过Thread,TheadPool,Task,async/await等来实现。 await能等待什么? 不能等待同步代码&#xff0c;只能等待Task或异步方法&#xff0c;且异步方法必须有返回值&#xff0c; async/await的出现…

遇到BUG怎么分析,全方位带你分析

软件测试的目的是尽可能早地找出软件产品中潜藏的缺陷&#xff0c;并确保其得以修复。所以缺陷的分析就会变得很关键&#xff0c;那么如何来分析缺陷呢&#xff1f; 根据缺陷的定义描述准则&#xff1a; 所有不满足需求或超出需求的都是缺陷。缺陷的判定主要的依赖点在于产品…