We're seeing some very strange behavior when running flask-limiter in the following environment (backed by memcache):
With a limit of 30 requests per minute, I see the following when printing out the flask-limiter debug headers:
iteration: 0, remaining 29, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 1, remaining 29, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 2, remaining 28, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 3, remaining 27, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 4, remaining 26, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 5, remaining 25, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 6, remaining 24, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 7, remaining 28, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 8, remaining 29, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 9, remaining 23, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 10, remaining 27, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 11, remaining 26, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 12, remaining 22, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 13, remaining 21, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 14, remaining 20, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 15, remaining 19, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 16, remaining 28, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 17, remaining 27, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 18, remaining 26, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 19, remaining 18, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 20, remaining 17, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 21, remaining 16, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 22, remaining 15, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 23, remaining 14, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 24, remaining 25, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 25, remaining 25, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 26, remaining 24, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 27, remaining 23, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 28, remaining 13, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 29, remaining 12, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 30, remaining 22, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 31, remaining 24, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 32, remaining 11, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 33, remaining 21, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 34, remaining 20, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 35, remaining 10, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 36, remaining 9, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 37, remaining 19, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 38, remaining 8, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 39, remaining 7, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 40, remaining 18, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256060'}
iteration: 41, remaining 6, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 42, remaining 5, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256061'}
iteration: 43, remaining 29, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256120'}
iteration: 44, remaining 28, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256120'}
iteration: 45, remaining 23, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 46, remaining 27, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256120'}
iteration: 47, remaining 22, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 48, remaining 21, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256072'}
iteration: 49, remaining 29, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256128'}
iteration: 50, remaining 26, headers {'x-ratelimit-limit': '30', 'x-ratelimit-reset': '1435256120'}