Of course, there are many ways to implement current limiting. Redis has very powerful functions. I have used Redis to practice three implementation methods, which can be implemented relatively simply. Redis can not only do current limiting, but also perform data statistics, nearby people and other functions.
1: Setnx based on Redis (Recommended Learning: Redis Video Tutorial )
## We are in When using Redis's distributed lock, everyone knows that it relies on the setnx instruction. During the CAS (Compare and swap) operation, the expiration time (expire) is set for the specified key at the same time. We are mainly limiting the current The purpose is to allow only N number of requests to access my code program within unit time. So relying on setnx can easily achieve this function.
For exampleWe need to limit 20 requests within 10 seconds, then we can set the expiration time to 10 when settingnx. When the number of requested setnx reaches 20, the current limiting effect is achieved.
Of course, there are many disadvantages to this approach. For example, when counting 1-10 seconds, it is impossible to count 2-11 seconds. If you need to count M requests within N seconds, then We need to keep N keys and other issues in RedisSecond type: Redis-based data structure zset
In fact, the most important thing involved in current limiting is sliding Window, it was also mentioned above how 1-10 becomes 2-11. In fact, the starting value and the end value are both 1.The third type: based on Redis Token Bucket Algorithm
When it comes to current limiting, we have to mention the token bucket algorithm. The Token Bucket Algorithm is also called the Bucket Algorithm. For details, please refer to Du Niang’s explanation. Token Bucket AlgorithmRely on the leftPop of List to obtain the token
// 输出令牌 public Response limitFlow2(Long id){ Object result = redisTemplate.opsForList().leftPop("limit_list"); if(result == null){ return Response.ok("当前令牌桶中无令牌"); } return Response.ok(articleDescription2); }Then rely on Java's scheduled tasks to rightPush the token into the List regularly. Of course, the token also needs to be unique, so I still use UUID to generate it here
// 10S的速率往令牌桶中添加UUID,只为保证唯一性 @Scheduled(fixedDelay = 10_000,initialDelay = 0) public void setIntervalTimeTask(){ redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString()); }Comprehensive It is not difficult to implement the code at first. For these current limiting methods, we can add the above code in AOP or filter to limit the current flow of the interface and ultimately protect your website. For more Redis-related technical articles, please visit the
Introduction to Using Redis Database Tutorial column to learn!
The above is the detailed content of Can redis itself limit the current flow?. For more information, please follow other related articles on the PHP Chinese website!