3

I just want to do rate limiting on a rest api using redi. Could you please suggest me, which datastructure in redis would be appropriate. I just used the RedisTemplate which is not feasible to expire an element, once after updating a key and value.

1 Answer 1

4

There are multiple approaches, depending on what exactly you are trying to achieve - from general "ops per second" limiting, to fine grained limits in a lower resolution, like how many posts a specific user can make per day, etc.

One very simple and elegant approach I like is an expiring counter. The technique is simple, and takes advantage of the fact that INCR does not change a key's expiration time in redis. So basically if you want 1000 requests per second on a resource, just create a key with the number 1 (by running INCR) and expire it in a second. Then for each request check if it's reached 1000 and if not increment it. If it has - block the request. When the time window has passed the key will expire automatically and will be recreated on the next request.

In terms of pseudo code, the algorithm is:

def limit(resource_key):

    current = GET(resource_key)
    if current != NULL and current >= 1000:
        return ERROR
    else:
        value = INCR(resource_key)
        IF value == 1:
            EXPIRE(value,1)

        return OK

Not the answer you're looking for? Browse other questions tagged or ask your own question.