文档章节

使用Redis实现访问频率控制

一别丶经年
 一别丶经年
发布于 2016/07/15 13:45
字数 606
阅读 322
收藏 5
点赞 0
评论 0

这里使用Redis递减配合适当的过期策略来实现

# 初始设定rate上限
$ SET access_times 100
# 设置60秒过期
$ EXPIRE access_times 60

用户每次调用API里,都需要判断access_times是否大于0

$ DECR access_times
(integer) 99

当返回数值小于等于0时,即不在允许用户访问,直到access_times重新初始化为大于0的数值,由于过期时间设置为60秒,所以初始的访问次数即为每分钟访问次数,当access_times过期时,则重新初始化之。这样就实现了每分钟最大允许访问XX次的需求。以上逻辑使用伪代码表示为

if exists key then
	return decr key
else
	set key 100
	expire key 60
	return 100
end

但在实际应用过程中,发现一个严重问题。如果在判断key过期时,key正处于即将过期状态(未过期),按照上述逻辑应执行decr key,返回自减后的数值,但如果此时刚好key过期,由于redis的机制,decr命令会生成一个新的key,并分配值为0,返回递减的值为-1,并且由于未设置过期时间,key将永不过期,导致程序始终返回负数。 为解决这个问题,同事想到一个办法,设置两个key,分别用来计数和控制过期,用伪代码表示

# key1用于计数、key2用于控制过期
if exists key2 then
	return decr key1
else 
	set key1 100
	set key2 1
	expire key2 60
	return 100
end

控制逻辑,判断表达式返回值小于等于0时,即不可访问,并间歇轮逻(如100ms),直接重新获取数值大于0,才通过访问控制,另外为了防止并发导致判断和计数不在一个事务内,整个表达式使用Lua脚本实现

# KEYS[1]表示限制次数,由调用程序传入
local key1 ,key2 = 'access:limit' ,'access:expire'
if redis.call('EXISTS' ,key2) > 0 then
	return redis.call('DECR' ,key1) ;
else 
	redis.call('SET' ,key2 ,1)
	redis.call('EXPIRE' ,key2 ,60)
	redis.call('SET' ,key1 ,KEYS[1])
	return KEYS[1]
end

个人网站同文链接:http://zlikun.com/redis_access_rate/

© 著作权归作者所有

共有 人打赏支持
一别丶经年
粉丝 16
博文 21
码字总数 25694
作品 0
徐汇
架构师
Redis脚本插件之————执行Lua脚本示例

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis...

tinywan1227
2016/10/20
0
0
通过 lua 进行 nginx redis 访问控制

1. 需求分析 1. Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等。 2. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制...

zzc052
06/29
0
0
开放平台API接口调用频率控制系统设计浅谈

先描述下基本场景: 系统API接口日均调用次数预计1亿次,提供5台服务器。 需要做两种层面的控制: > 单IP、单应用每小时调用次数不超过10000次 > 单应用、单用户、单接口每小时调用次数不超过...

优雅先生
2014/09/11
0
17
使用php redis实现简单的注册登录功能

主要使用的是hash结构来存储用户数据,列表来存储访问的频率 email.to.id存储的是邮箱和用户id的对应关系 user:{$userID}存储的是用户的email、password、nickname基本数据 retrieve.passwor...

RitaChen
2016/11/16
58
0
.Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)

现在,因为种种因素,你必须对一个请求或者方法进行频率上的访问限制。 比如, 你对外提供了一个API接口,注册用户每秒钟最多可以调用100次,非注册用户每秒钟最多可以调用10次。 比如, 有一...

dotNET跨平台
01/12
0
0
流量调整和限流技术

漏桶算法:https://en.wikipedia.org/wiki/Leakybucket 它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供...

张舒歌
2016/12/11
174
0
在scrapy+redis实现分布式爬虫中,如何实现对各个分布的爬虫获取URL的均衡

我在用scrapy+redis实现一个简单的分布式爬虫,但运行后,一个爬虫爬地快,一个爬虫 爬地慢,我想请教各位如何实现redis对各个爬虫获取URL速度或者频率的控制以达到均衡? 谢谢!...

一字并肩王之龙巡天下
2017/03/25
601
1
API访问频率限制的解决方案

有时候我们需要限制一个API访问的频率,例如单用户一分钟之内只能访问多少次。 类似于这样的需求很容易用Redis来实现。 <?php require('predis/src/Autoloader.php'); $redis = new PredisC...

crazymus
2015/11/24
3.5K
8
SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:antirez)开发的一款内存高速缓存数据库。Redis 全称为 Remote Dictionary Server(远程数据服务),使用 C 语言编写,是一个 key-valu...

keke
2017/11/16
0
0
关于反爬虫和恶意攻击的一些策略和思路

前段时间Guang.com经常受到恶意spider攻击,疯狂抓取网站内容,一系列机器人spam发广告,对网站性能有较大影响。 下面我说说一些反恶意spider和spam的策略和思路。 1. 通过日志分析来识别恶意...

Cnlouds
2014/03/09
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

全新内存布局Android5 for one x

众所周知Android5.0默认ART模式,运行速度加倍,软件占用内存也加倍,我们one x这种元老机采用旧的内存布局,data空间2g ART模式下安装几个软件也就不够用了。最近逛国外的xda论坛,发现有大...

CrazyManDF
6分钟前
0
0
web3j转账

 web3 转账功能   为了完成以太坊交易,必须有几个先决条件   1、对方的以太坊地址   2、确定要转账的金额   3、自己地址的转账权限   4、大于转账金额的以太币,以太币转账其实就...

智能合约
7分钟前
0
0
10.28 rsync工具介绍 , rsync常用选项, rsync通过ssh同步

rsync远程同步 重点!重点!!重点!!! 例子 • rsync -av /etc/passwd /tmp/1.txt • rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt rsync格式 • rsync [OPTION] … SRC DEST • rs......

Linux_老吴
21分钟前
0
0
iis php 环境搭建,非常详细的教程

准备篇 一、环境说明: 操作系统:Windows Server 2016 PHP版本:php 7.1.0 MySQL版本:MySQL 5.7.17.0 二、相关软件下载: 1、PHP下载地址: http://windows.php.net/downloads/releases/ph...

T_star
23分钟前
0
0
Day35 rsync通过服务同步

rsync通过服务同步 rsyncd.conf配置文件详解 port:指定在哪个端口启动rsyncd服务,默认是873端口。 log file:指定日志文件。 pid file:指定pid文件,这个文件的作用涉及服务的启动、停止等...

杉下
28分钟前
1
0
【最新最全】为 iOS 和 Android 的真机和模拟器编译 Luajit 库

编译 Luajit 库,的确是一个挑战。因为官网的教程,在当前版本的 Xcode 和 NDK 环境中,已经不适用了。以前只是编译了适用于真机的 Luajit 库。最近在尝试编译模拟器 Luajit 库,就顺便梳理了...

ios122
28分钟前
0
0
rsync至ssh同步

rsync: 文件同步工具,可实现“增量拷贝”;使用yum安装rsync包 常用选项:-a=-rtplgoD (-r同步目录,-t保持文件的时间属性,-p保持文件的权限属性,-l保持软连接,-g保持文件的属组,-o保持...

ZHENG-JY
34分钟前
0
0
TradingView 学习笔记

#前言 公司最后需要使用TradingView展示K线图走势。由于之前没接触过,拿到文档时一脸蒙逼。还好找到二篇文章+Demo代码,直接改改就行了。 #被批 由于上面的懵懂,有个问题困扰4个小时没解决...

hihubs
34分钟前
0
0
10.28 rsync工具介绍~10.31 rsync通过ssh同步

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而...

洗香香
36分钟前
1
0
卷积为什么要旋转180度

参考《最容易理解的对卷积(convolution)的解释》 https://blog.csdn.net/bitcarmanlee/article/details/54729807 这篇博客详细讲解了“卷积”,提及了为什么要反转180度,我简述下。 1.卷积的...

datadev_sh
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部