Return value
<h1 class="command"><span class="name">redis提供了rate limit demo 如下所示: Available since 1.0.0. Time complexity:?O(1) Increments the number stored at? Note: this is a string operation because Redis does not have a dedicated integer type. The string stored at the key is interpreted as a base-10?64 bit signed integer?to execute the operation. Redis stores integers in their integer representation,so for string values that actually hold an integer,there is no overhead for storing the string representation of the integer. Return value: the value of? Examples?
OK? (integer) 11? "11" Pattern: CounterThe counter pattern is the most obvious thing you can do with Redis atomic increment operations. The idea is simply send an??command to Redis every time an operation occurs. For instance in a web application we may want to know how many page views this user did every day of the year. To do so the web application may simply increment a key every time the user performs a page view,creating the key name concatenating the User ID and a string representing the current date. This simple pattern can be extended in many ways:
Pattern: Rate limiterThe rate limiter pattern is a special counter that is used to limit the rate at which an operation can be performed. The classical materialization of this pattern involves limiting the number of requests that can be performed against a public API. We provide two implementations of this pattern using?,where we assume that the problem to solve is limiting the number of API calls to a maximum of?ten requests per second per IP address. Pattern: Rate limiter 1The more simple and direct implementation of this pattern is the following:
Basically we have a counter for every IP,for every different second. But this counters are always incremented setting an expire of 10 seconds so that they'll be removed by Redis automatically when the current second is a different one. Note the used of??and??in order to make sure that we'll both increment and set the expire at every API call. Pattern: Rate limiter 2An alternative implementation uses a single counter,but is a bit more complex to get it right without race conditions. We'll examine different variants.
The counter is created in a way that it only will survive one second,starting from the first request performed in the current second. If there are more than 10 requests in the same second the counter will reach a value greater than 10,otherwise it will expire and start again from 0. In the above code there is a race condition. If for some reason the client performs the??command but does not perform the??the key will be leaked until we'll see the same IP address again. This can be fixed easily turning the??with optional??into a Lua script that is send using the??command (only available since Redis version 2.6).
There is a different way to fix this issue without using scripting,but using Redis lists instead of counters. The implementation is more complex and uses more advanced features but has the advantage of remembering the IP addresses of the clients currently performing an API call,that may be useful or not depending on the application.
The??command only pushes the element if the key already exists. Note that we have a race here,but it is not a problem:??may return false but the key may be created by another client before we create it inside the??/??block. However this race will just miss an API call under rare conditions,so the rate limiting will still work correctly. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |