python-throttle

Super naive python redis limiter


Keywords
throttle, limiter, redis, counter, timer, middleware, python
License
MIT
Install
pip install python-throttle==0.2.0

Documentation

python version Build Status codecov PyPI version

python redis backed limiter

sliding log or fixed window limiter

This module mainly offer two limiter

  • FixedWindowLimiter
    simply using redis incr, which about 10 times the speed of the sliding version but the limit is not smooth, may overflow a threshold size near the gap between two intervals
  • SlidingWindowLimiter  
    using redis ordered set, slow but offers more smooth limit and more extendability

installation

pip install python-throttle

dummy example usage:

reminder: use name_space to avoid possible conflict on the same key

import time
from limiter import FixedWindowLimiter
TEST_REDIS_CONFIG = {'host': 'localhost','port': 6379,'db': 10}
ip = "who are you?"
throttle = FixedWindowLimiter(threshold=2, interval=3, redis_config=TEST_REDIS_CONFIG, name_space="default")
print("first time, blocked?: {}".format(throttle.exceeded(ip)))
print("second time, blocked?: {}".format(throttle.exceeded(ip)))
print("now I block you, blocked?: {}".format(throttle.exceeded(ip)))
time.sleep(3)
print("refill energy, blocked?: {}".format(throttle.exceeded(ip)))

ouput:

first time blocked?: False
second time blocked?: False
now I block you blocked?: True
refill energy blocked?: False

Reset the limiter:

throttle.reset()

dummy beach mark

It is from my unittest and not accurate,

rate_counter_pressure_test: SlidingRedisCounter
rate_counter_pressure_test: SlidingRedisCounter time count: 1.0075314449495636
rate_counter_pressure_test: FixedWindowRedisCounter
rate_counter_pressure_test: FixedWindowRedisCounter time count: 0.13711917598266155