数码资讯
一个在redis数据库分布式速率限制的实现方法
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
问题
在许多应用中,使用昂贵的资源,必须限制和速率限制是必要的,在这个时候,许多现代网络应用运行在多个进程和服务器,和国家需要共享。一个理想的解决方案应该是有效的、快速的,而不是依靠一个单一的应用程序服务器,绑定到一个特定的客户端(由于负载平衡)或本身持有任何国家。
解决方案
一个简单而有效的方式来实现这一目标是使用redis,它有很多有用的数据结构和函数,虽然限速只需要2大功能:第一,增加在特定关键整数,设置过期时间,关键的两。
因为redis有一个单一的事件循环系统(每个人可以同时执行一个操作),这是一个原子操作。也就是说,无论多少客户机在同一时间内相互作用,对于相同的键值总是有一定的值。
对于同一资源的多速率限制,这通常是有益的,因为它允许少量的破裂和较长的期限。例如,每秒请求3次,每分钟不到20次。因为每个限制是相对独立的,这需要从其他限制中单独增加。
因为速度限制通常采用的是更为重要的资源(如Web应用程序),从而缩短速度限制尽可能多的使用时间是非常必要的。Redis最基本的应用是发送命令,等待响应,然后发送另一个命令,所以这个成本是昂贵的回报。,因为网络需要回到多次和Redis服务器通过网络应用程序之间。由于没有命令取决于使用情况的其他命令的执行结果,这使得一个redis使用流水线技术。这是所有redis客户端缓存的请求,然后把这写请求和Redis Redis,返回所有结果一次。
Redis不维护,客户需求的限制,因为redis会删除旧的内存数量按照客户的时间期限。这消除了客户端的协调需要协调和删除竞争条件的可能性。
代码
进口redis
进口时间
DEF rate_limit_check(R,关键,限制):
period_lengths = { _ { 0 }在排序(限制项目)(_)}
period_limits = { _ { 1 }在排序(限制项目)(_)}
管= r.pipeline()
对于period_length在period_lengths:
current_period = int(time.time()/ period_length)
redis_key = 'rate_limit:{重点}:{ period_length }:{ current_period }。格式(关键=键,period_length = period_length,current_period = current_period)
pipe.incr(redis_key)。到期(redis_key,period_length×3)
没有任何回报(点击> period_limit为period_limit,点击ZIP(period_limits,pipe.execute())
如果__name__ = = '__main__:
R = Redis的Redis()。
打印rate_limit_check(R,'127.0.0.1,{ 1:3, 60:20 })
{ 1:3, 60:20 }意味着每秒3次的点击率是允许的,而且在任何限制,20次是允许的。'127.0.0.1'is用在这里作为一个重要的价值,虽然在现实情况下,它可以作为一个IP地址。更先进的使用情况将有一个完整的应用率极限。关键值是客户端的IP地址,和一个特定的端点限制设置为昂贵的端点,将用于客户端的IP地址和端点,如127.0.0.1 + / /登录。这些限制可以独立设置。
返回rate_limit_check(R,'127.0.0.1,{ 1:3, 60:20 })和rate_limit_check(R,'127.0.0.1 + / /登录,{ 1:2)
这是用Python写的一个例子,它可以简单地移植到任何语言,只要语言包含redis客户端库。
在许多应用中,使用昂贵的资源,必须限制和速率限制是必要的,在这个时候,许多现代网络应用运行在多个进程和服务器,和国家需要共享。一个理想的解决方案应该是有效的、快速的,而不是依靠一个单一的应用程序服务器,绑定到一个特定的客户端(由于负载平衡)或本身持有任何国家。
解决方案
一个简单而有效的方式来实现这一目标是使用redis,它有很多有用的数据结构和函数,虽然限速只需要2大功能:第一,增加在特定关键整数,设置过期时间,关键的两。
因为redis有一个单一的事件循环系统(每个人可以同时执行一个操作),这是一个原子操作。也就是说,无论多少客户机在同一时间内相互作用,对于相同的键值总是有一定的值。
对于同一资源的多速率限制,这通常是有益的,因为它允许少量的破裂和较长的期限。例如,每秒请求3次,每分钟不到20次。因为每个限制是相对独立的,这需要从其他限制中单独增加。
因为速度限制通常采用的是更为重要的资源(如Web应用程序),从而缩短速度限制尽可能多的使用时间是非常必要的。Redis最基本的应用是发送命令,等待响应,然后发送另一个命令,所以这个成本是昂贵的回报。,因为网络需要回到多次和Redis服务器通过网络应用程序之间。由于没有命令取决于使用情况的其他命令的执行结果,这使得一个redis使用流水线技术。这是所有redis客户端缓存的请求,然后把这写请求和Redis Redis,返回所有结果一次。
Redis不维护,客户需求的限制,因为redis会删除旧的内存数量按照客户的时间期限。这消除了客户端的协调需要协调和删除竞争条件的可能性。
代码
进口redis
进口时间
DEF rate_limit_check(R,关键,限制):
period_lengths = { _ { 0 }在排序(限制项目)(_)}
period_limits = { _ { 1 }在排序(限制项目)(_)}
管= r.pipeline()
对于period_length在period_lengths:
current_period = int(time.time()/ period_length)
redis_key = 'rate_limit:{重点}:{ period_length }:{ current_period }。格式(关键=键,period_length = period_length,current_period = current_period)
pipe.incr(redis_key)。到期(redis_key,period_length×3)
没有任何回报(点击> period_limit为period_limit,点击ZIP(period_limits,pipe.execute())
如果__name__ = = '__main__:
R = Redis的Redis()。
打印rate_limit_check(R,'127.0.0.1,{ 1:3, 60:20 })
{ 1:3, 60:20 }意味着每秒3次的点击率是允许的,而且在任何限制,20次是允许的。'127.0.0.1'is用在这里作为一个重要的价值,虽然在现实情况下,它可以作为一个IP地址。更先进的使用情况将有一个完整的应用率极限。关键值是客户端的IP地址,和一个特定的端点限制设置为昂贵的端点,将用于客户端的IP地址和端点,如127.0.0.1 + / /登录。这些限制可以独立设置。
返回rate_limit_check(R,'127.0.0.1,{ 1:3, 60:20 })和rate_limit_check(R,'127.0.0.1 + / /登录,{ 1:2)
这是用Python写的一个例子,它可以简单地移植到任何语言,只要语言包含redis客户端库。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。