文档章节

redis限速器的几种方法

漂泊尘埃
 漂泊尘埃
发布于 2016/11/04 16:19
字数 372
阅读 174
收藏 0

Redis Rate Limiter

redis 实现限速器的几种方式。

GET + INCR + EXPIRE

先获取 key 的当前值,如果没有超出限制再执行 INCR 增1,如果 key 不存在,使用 redis 的事务初始化 key 和过期时间。

伪代码:

count = redis.GET(key)
if redis return nil {
  redis.MULTI
  	redis.INCR(key)
  	redis.EXPIRE(key, expire_time)
  redis.EXEC
  count = 1
}
if count > limit {
  return 超出限制
} else {
  redis.INCR(key)
}

高并发下的问题:

如果同时10个并发程序执行 GET 返回了 nil, 那么这10个并发程序都会执行 redis 的事务将 key 增一,但每个程序的 count 值都为1,如果 limit 设置的值小于10,那么真正执行的程序就超过限制了。如果执行完事务后再查一次 redis 赋值给 count,那么每个程序可能都会返回10,从而没有程序能够继续执行。

key 已经存在的情况下,先 GETINCR 的逻辑也可能会出现实际执行的程序数多于 limit 的情况。

INCR + EXPIRE

INCR, 如果值为1说明是 key 刚设置的,此时再执行 EXPIRE

伪代码:

count = redis.INCR(key)
if count == 1 {
  redis.EXPIRE(key, expire_time)
}
if count > limit {
  return 超出限制
}

慎用

如果 INCR 之后程序挂掉了,没有执行 EXPIRE, 那么这个 key 就没有过期时间了,具体的影响视需求而定。

lua脚本

摘自 http://redisdoc.com/string/incr.html, 我不会lua

local current
current = redis.call("incr",KEYS[1])
if tonumber(current) == 1 then
    redis.call("expire",KEYS[1],1)
end

© 著作权归作者所有

上一篇: GRPC源码解读
下一篇: Python-字典和集合
漂泊尘埃

漂泊尘埃

粉丝 6
博文 38
码字总数 76552
作品 0
朝阳
私信 提问
Redis INCR key

INCR key 起始版本:1.0.0 时间复杂度:O(1) 对存储在指定的数值执行原子的加1操作。 如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为。 如果指定的key中存储的值不是字符...

太阳黑子
2016/10/27
4
0
Redis原子计数器incr,防止并发请求

一、前言 在一些对高并发请求有限制的系统或者功能里,比如说秒杀活动,或者一些网站返回的当前用户过多,请稍后尝试。这些都是通过对同一时刻请求数量进行了限制,一般用作对后台系统的保护...

IT--小哥
2018/10/26
0
0
11.11:度盘更新,免登录下载已失效,附缓解方法

前言 前几天百度网盘升级,基本所有通过获取直链,多线程下载突破限速的方法都失效了。 现在包括之前介绍过的 Pandownload、速盘、油猴脚本等方法,免登录模式都已不可用,必须要登录账户后才...

己立
2018/11/11
0
0
SSDB 1.6.8.7 发布, 支持 Android 运行

SSDB 1.6.8.7 版本发布了, 这一个版本最大的改进是: 支持在Android设置上运行 增加同步限速功能 支持 flushdb list SSDB 是一个替代 Redis 的 NoSQL 存储服务器, 可将数据存储在硬盘上, 所以...

ideawu
2014/05/26
2.6K
10
Spring Data Redis 详解及实战一文搞定

SDR - Spring Data Redis的简称。 Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。它提供了与商店互动的低级别和高级别抽象,使用户免受基础设施问题的困扰。 Spring B...

Java技术栈
2018/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kubernetes云供应商架构的未来

首先,我想分享SIG的使命,因为我们用它来指导我们现在和将来的工作。从我们的章程中直接来看,SIG的使命是简化,开发和维护云供应商集成,作为Kubernetes集群的扩展或附加组件。这背后的动机...

Linux就该这么学
20分钟前
1
0
线程池没你想的那么简单

前言 原以为线程池还挺简单的(平时常用,也分析过原理),这次是想自己动手写一个线程池来更加深入的了解它;但在动手写的过程中落地到细节时发现并没想的那么容易。结合源码对比后确实不得...

crossoverJie
28分钟前
16
0
Scientific Linux开发停止 相关设备将迁移至CentOS上

在经历了将近14年的版本更迭之后,这个专注于科学领域的GNU/Linux发行版本不会发布下个重大版本更新--Scientific Linux 8了。 目前维护该发行版本的成员最终决定是时候休息了,今后将不再发布...

linuxCool
32分钟前
1
0
Redux

Redux概念 Redux = Reducer + Flux,数据层框架,将所有数据都存储到store中 Redux的工作流程 Antd的使用 安装npm install antd --save import 'antd/dist/antd.css'import { Input, Butto......

星闪海洋
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部