Redis zset 简单限流

本文介绍了如何利用Redis的ZSet数据结构实现一个简单的限流策略。通过为每个用户行为创建特定的key,并记录请求的时间戳,服务器可以在指定时间段内限制用户的请求次数。当请求超过最大值时,系统会返回false阻止进一步操作。文中还提供了具体的代码示例,展示了如何检查和更新ZSet,以及如何根据设定的过期时间清理旧记录,确保限流效果。
摘要由CSDN通过智能技术生成

场景

为防止用户在短时间内对服务器发起大量请求,服务器端须判断某一用户(userId)的某一个行为(actionKey)在指定时间段(period)内是否超出最大请求次数(maxCount),如果未超过,返回 true ,继续执行业务逻辑,否则返回 false

原理

以用户lucas的reply请求为例。
lucas向服务器发起一次reply请求,先检查系统中保存的以lucas+reply为key的记录的数量N,如果N大于maxCount,返回 false。如果N小于maxCount,将lucas+reply 作为 zset 的 key,当前时间作为zset的member 和 score 插入到zset中,返回 true。
因为系统只需检查从 (当前时间 - period) 到 当前时间 这段时间内用户行为的请求数量,因此可以将小于(当前时间 - period)的所有用户的所有行为的记录删除,因此可以为每条记录设置过期时间。

代码

以下代码参考 钱文品《Redis深度历险:核心原理和应用实践》应用 6:断尾求生——简单限流 ,但有逻辑上的不同。

package me.lucas.redisinaction.redis;

import redis.clients.jedis.Jedis;

/**
 * 用redis zset实现的简单的限流策略
 * 限定 userId 的 actionKey 行为在 period 秒内只允许发生 maxCount 次
 * Author: lin
 * Date: 2019/9/12 9:57
 */
public class MySimpleRateLimiter {
   
    private Jedis jedis;

    private MySimpleRateLimiter(Jedis jedis) {
   
        this.jedis = jedi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值