Home  >  Article  >  Database  >  Can redis itself limit the current flow?

Can redis itself limit the current flow?

(*-*)浩
(*-*)浩Original
2019-11-22 10:08:402574browse

Can redis itself limit the current flow?

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 example

We 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 Redis

Second 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.


And if we use the list data structure of Redis, we can easily implement this function


We can create the request into a zset array, and when each request comes in , the value remains unique and can be generated by UUID, and the score can be represented by the current timestamp, because the score can be used to calculate the number of requests within the current timestamp.

The zset data structure also provides the range method so that we can easily get how many requests there are within 2 timestamps


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 Algorithm


The Token Bucket algorithm mentions input rate and output rate. When the output rate is greater than the input rate , then the traffic limit is exceeded.


That is to say, every time we access a request, we can get a token from Redis. If we get the token, it means that the limit has not been exceeded, and if we cannot get it, then The result is the opposite.


Relying on the above ideas, we can combine the List data structure of Redis to easily achieve such code


Rely 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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn