Skip to content
Browse files

添加《限速器》大纲

  • Loading branch information...
1 parent 550e2b3 commit af9263441d4e82abf3bd0c7a8a19571d45dec8e6 @huangz1990 huangz1990 committed
Showing with 24 additions and 17 deletions.
  1. +1 −17 usage/counter.md
  2. +23 −0 usage/limiter.md
View
18 usage/counter.md
@@ -77,23 +77,7 @@
# ...
end
-除此之外,我们还可以通过计数器来对访问次数进行限制。举个例子,以下代码就强制某个用户在一分钟里最多只能访问 30 次图书页面:
-
- get '/book/*' do
- key = '#{user_id} book-page-view'
- pv = incr(key)
- if pv == 1
- # 首次访问,设置过期时间
- $redis.expire(key, 60)
- elsif pv > 30
- # 访问次数过多
- error_message('visit too much time')
- else
- # ... 正常显示页面
- end
- end
-
-这个访问限制器并不完美,因为它带有一个竞争条件:客户端可能会因为失败而忘记设置过期时间,从而导致每个用户只能访问图书页面 30 次,这真的会非常糟糕! [INCR 命令的文档](http://redis.readthedocs.org/en/latest/string/incr.html) 详细地说明了如何构建一个正确的访问限制器。
+现在,要查看某个图书页面的点击量,调用 ``get("page-view #{id}")`` 就可以了。
## 实例:顺序自增标识符(sequential auto increment id)
View
23 usage/limiter.md
@@ -0,0 +1,23 @@
+# 限速器
+
+TODO:
+
+## 实例:阅览限速器
+
+以下代码就强制某个用户在一分钟里最多只能访问 30 次图书页面:
+
+ get '/book/*' do
+ key = '#{user_id} book-page-view'
+ pv = incr(key)
+ if pv == 1
+ # 首次访问,设置过期时间
+ $redis.expire(key, 60)
+ elsif pv > 30
+ # 访问次数过多
+ error_message('visit too much time')
+ else
+ # ... 正常显示页面
+ end
+ end
+
+这个访问限制器并不完美,因为它带有一个竞争条件:客户端可能会因为失败而忘记设置过期时间,从而导致每个用户只能访问图书页面 30 次,这真的会非常糟糕! [INCR 命令的文档](http://redis.readthedocs.org/en/latest/string/incr.html) 详细地说明了如何构建一个正确的访问限制器。

0 comments on commit af92634

Please sign in to comment.
Something went wrong with that request. Please try again.