Redis中的限流八股文

Current Limiting

在编写系统时候有时候我们的系统在设计的时候就已经估算到了最大请求负载了,如果大量的请求超过系统所能承受着的值时,那么系统可能随时挂掉,所有聪明程序员就想到了请求限流来控制系统的可用和稳定性。

滑动窗口限流

滑动窗口算法将一个大的时间窗口分成多个小窗口,每次大窗口向后滑动一个小窗口,并保证大的窗口内流量不会超出最大值,这种实现比固定窗口的流量曲线更加平滑。

Redis中的限流八股文

滑动窗口

以系统限制用户行为为例子,比如一秒内进行某个操作5次,这种行为应该进行限制,滑动窗口就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流。

public boolean isActionAllowed(String userId, String actionKey, int period, int maxCount) {
    // 生成唯一的key
    String key = String.format("hist:%s:%s", userId, actionKey);
    long nowTs = System.currentTimeMillis();
    // 使用管道
    Pipeline pipe = jedis.pipelined();
    pipe.multi();
    // 添加当前操作当zset中
    pipe.zadd(key, nowTs, "" + nowTs);
    // 整理zset,删除时间窗口外的数据 符合条件的保留
    pipe.zremrange
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值