断尾求生——基于Redis简单限流策略实现与应用.pdfVIP

断尾求生——基于Redis简单限流策略实现与应用.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

应用6:断尾求生——简单限流

限流算法在分布式领域是⼀个经常被提起的话题,当系统的处理能⼒

有限时,如何阻⽌计划外的请求继续对系统施压,这是⼀个需要重视

的问题。⽼钱在这里用“断尾求生”形容限流背后的思想,当然还有

很多成语也表达了类似的意思,如弃卒保⻋、壮⼠断腕等等。

除了控制流量,限流还有⼀个应用⽬的是用于控制用户⾏为,避免垃

圾请求。⽐如在UGC社区,用户的发帖、回复、点赞等⾏为都要严

格受控,⼀般要严格限定某⾏为在规定时间内允许的次数,超过了次

数那就是⾮法⾏为。对⾮法⾏为,业务必须规定适当的惩处策略。

如何使用Redis来实现简单限流策略?

⾸先我们来看⼀个常⻅的简单的限流策略。系统要限定用户的某个

⾏为在指定的时间里只能允许发生N次,如何使用Redis的数据结

构来实现这个限流的功能?

我们先定义这个接口,理解了这个接口的定义,读者就应该能明白我

们期望达到的功能。

应用6:断尾求生——简单限流

限流算法在循环领域是一个经常被提起的话题,当系统的处理能力有限时,

如何计划外的请求继续对系统施压,这是一个需要重视的问题。老钱在

这里用“尾断求生”的意思表示限流背后的思想,当然还有很多成语也表达

了类似的,如弃卒保、壮士断腕等等。

除了流量、限流之外还有一个应用目的是为了控制用户行为,避免罚款请求。

比如在UGC社区,用户的发帖、回复、点赞等行为控制要严格格受控,一般要

严格限定某行为在规定的时间内允许的次数,超过了次数那就是违法行为。对

行为业务,必须规定适当的惩罚处策略。

如何使用Redis来实现简单的限流策略?

首先我们来看一个允许常见的简单的限流策略。系统要限制用户的某个

行为在指定的时间里只能发生N次,如何使用Redis的数据结构来实现

这个限流的功能?

我们首先定义了这个接口,理解了这个接口的定义,读者就应该能够明

白我们想要达到的功能。

#指定用户user_id的某个⾏为action_key在特定的时间内

period只允许发生⼀定的次数max_count

defis_action_allowed(user_id,action_key,

period,max_count):

returnTrue

#调用这个接口,⼀分钟内只允许最多回复5个帖子

can_reply=is_action_allowed(laoqian,reply,

60,5)

ifcan_reply:

do_reply()

else:

raiseActionThresholdOverflow()

先不要继续往后看,想想如果让你来实现,你该怎么做?

解决方案

这个限流需求中存在⼀个滑动时间窗口,想想zset数据结构的

score值,是不是可以通过score来圈出这个时间窗口来。而且我

们只需要保留这个时间窗口,窗口之外的数据都可以砍掉。那这个

zset的value填什么⽐较合适呢?它只需要保证唯⼀性即可,用

uuid会⽐较浪费空间,那就改用毫秒时间戳吧。

#指定用户user_id的某种行为action_key在特定的期限内只允

许发生一定的次数max_countdefis_action_allo

wed(user_id,action_key,period,max_count):returnTrue#

调用这个接口,一分钟内只允许最多回复5个帖子can_reply=

is_action_allowed(laoqian,reply,60,5)ifcan_reply:

do_reply()else:ActionThresholdOverflow()

文档评论(0)

183****7931 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档