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); }
// 10S的速率往令牌桶中添加UUID,只为保证唯一性 @Scheduled(fixedDelay = 10_000,initialDelay = 0) public void setIntervalTimeTask(){ redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString()); }
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!