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

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.mfbz.cn/a/871450.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring核心思想讲解之控制反转(IOC)

控制反转概述 控制反转实现方式 XML方式 方式一 方式二 方式三 注解方式 第一步 第二步 第三步 依赖注入&#xff08;DI&#xff09;实现方式 XML方式 手动注入 set注入 构造器注入 自动注入 set注入 构造方法注入 注解方式 方式一&#xff1a; 方式二&…

用excel内容批量建立文件夹

建文件夹是电脑操作过程中比较常见的&#xff0c;但是用EXCEL内容批量建文件夹&#xff0c;这似乎不相关的两个操作&#xff0c;那么怎么实现这样的一个功能&#xff0c;我们需要用到专门的软件进行关联&#xff0c;推荐&#xff1a;可易文件夹批量生成器&#xff0c;这个软件有…

RCE编码绕过--php://filter妙用

目录 代码 如何绕过 payload构造 代码 <?php $content <?php exit; ?>; $content . $_POST[txt]; file_put_contents($_POST[filename],$content); 当你想要输入代码的时候前面会有<?php exit;?>;&#xff0c;代码没有办法执行下去&#xff0c;所以…

Linux驱动学习之点灯(四,linux2.6)

上篇最后的第二种点灯方法年代比较久远&#xff0c;register_chrdev&#xff08;&#xff09;这个函数一下申请了255个设备号&#xff0c;不建议使用 如下图 下图的函数在linux2.6里是上图函数的升级版&#xff0c;不过他是静态分配&#xff0c;后续还得添加到cdev里 从上图函…

【自动驾驶】控制算法(三)轮胎侧偏与车辆动力学模型

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

回收站的文件删除了怎么恢复?4个技巧轻松找回文件!

在日常使用电脑的过程中&#xff0c;回收站作为我们删除文件的临时存放地&#xff0c;扮演着重要的角色。然而&#xff0c;有时我们可能会不小心从回收站中删除了重要文件&#xff0c;导致数据丢失。面对这种情况&#xff0c;许多用户会感到焦虑和无助。但别担心&#xff0c;本…

白酒与素食:健康与美味的双重享受

在美食的世界里&#xff0c;白酒与素食的搭配仿佛是一场跨界的盛宴。豪迈白酒&#xff08;HOMANLISM&#xff09;的醇香与精致素食的清新&#xff0c;在不经意间交织出了一幅美妙的画卷&#xff0c;让人在品味中感受到健康与美味的双重享受。 素食&#xff0c;以其清淡、自然的…

CORS error 302 Found

CORS error && 302 Found 场景 单点登录认证&#xff1a;访问A系统&#xff0c;在B系统登录认证 此处代码为A系统 controller ResponseBodyGetMapping("/idp/loginCheck")public void loginCheck(HttpServletRequest request, HttpServletResponse httpR…

使用 nginx 搭建代理服务器(正向代理 https 网站)指南

写在前面 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 文章目录 简介正向代理 简介ngx_http_proxy_connect_module 介绍 详细步骤包准备Linux 编译并安装 nginx修改 nginx 配置文件ngin…

【实现100个unity特效之24】使用ShaderGraph将图片转变为像素艺术

ShaderGraph连线图 效果 参考 https://www.youtube.com/watch?vBmhj7RgVDzc 完结 赠人玫瑰&#xff0c;手有余香&#xff01;如果文章内容对你有所帮助&#xff0c;请不要吝啬你的点赞评论和关注&#xff0c;你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章…

Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/ PostgreSQL 提供各种超时 (Timeout) 设置&#xff0c;通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要&#xff0c;尤其是在高流量或复杂查询的环境中。让我们…

学习大数据DAY42 hive 分桶表

目录 分桶表 分桶表注意事项 hive 分桶表-创建分桶表 hive 排序关键字 hive 排序语句 上机练习 分桶表 分区提供一个隔离数据和优化查询的便利方式。不过&#xff0c;并非所有的数据集都可形 成合理的分区。对于一张表或者分区&#xff0c;Hive 可以进一步组织成桶&…

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及&#xff0c;网络安全问题日益严峻&#xff0c;API&#xff08;应用程序接口&#xff09;已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁&#xff0c;其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

【区块链+商贸零售】消费券 2.0 应用方案 | FISCO BCOS应用案例

方案基于FISCO BCOS区块链技术与中间件平台WeBASE&#xff0c;实现新一代消费券安全精准高效发放&#xff0c;实现消费激励&#xff0c; 促进消费循环。同时&#xff0c;方案将用户消费数据上链&#xff0c;实现账本记录与管理&#xff0c;同时加密机制保证了数据安全性。

【解决】Python | ModuleNotFoundError: No module named codecs

【解决】Python | ModuleNotFoundError: No module named codecs 在Python开发中&#xff0c;ModuleNotFoundError: No module named codecs 是一个相对罕见的错误&#xff0c;因为 codecs 是Python标准库中的一个模块&#xff0c;通常应该总是可用的。然而&#xff0c;当你遇到…

【kubernetes】k8s配置资源管理

一、ConfigMap资源配置 ConfigMap保存的是不需要加密配置的信息 ConfigMap 功能在 Kubernetes1.2 版本中引入&#xff0c;许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制&#xff0c;ConfigMap 可以被…

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

43.x86游戏实战-XXX寻找吸怪坐标

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

如何在 FastReport .NET 中构建和安装 Postgres 插件

FastReport .NET 是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案。 功能非常丰富&#xff0c;功能广泛。今天我们将介绍如何使用报表设计器的 FastReport 插件连接数据库。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体…

SQL注入(cookie、base64、dnslog外带、搜索型注入)

目录 COOKIE注入 BASE64注入 DNSLOG注入—注入判断 什么是泛解析&#xff1f; UNC路径 网上邻居 LOAD_FILE函数 搜索型注入—注入判断 本文所使用的sql注入靶场为sqli-labs-master&#xff0c;靶场资源文件已上传&#xff0c;如有需要请前往主页或以下链接下载 信安必备…