== free plan is 5 per minute, pro plan is 20 per minute
25 requests each: free-key-123 allowed 5, pro-key-456 allowed 20
== /api/report costs 5 tokens, /api/hello costs 1
GET /api/hello  X-API-Key: pro-key-456  -> 200  limit=20 remaining=19 retry-after=null
GET /api/report X-API-Key: pro-key-456  -> 200  limit=20 remaining=14 retry-after=null
GET /api/report X-API-Key: pro-key-456  -> 200  limit=20 remaining=9 retry-after=null
GET /api/report X-API-Key: pro-key-456  -> 200  limit=20 remaining=4 retry-after=null
GET /api/report X-API-Key: pro-key-456  -> 429  limit=20 remaining=4 retry-after=3
-- 20 tokens = 1 hello + 3 reports (16), 4 left; a 4th report needs 5, so it waits for the refill
== an unknown API key
GET /api/hello  X-API-Key: made-up-key  -> 401  limit=null remaining=null retry-after=null
body: {"type":"about:blank","title":"Unauthorized","status":401,"detail":"Unknown API key"}
keys in Redis after the 401: 0
== what is in Redis after one request each from a key, a user and an anonymous caller
$ redis-cli --scan | sort
rl:global
rl:ip:127.0.0.1
rl:key:ea39d5800282edc4
rl:user:alice
$ redis-cli TYPE rl:key:ea39d5800282edc4
string
$ redis-cli STRLEN rl:key:ea39d5800282edc4
116
$ redis-cli PTTL rl:user:alice  (a bucket expires once it has been full for 10 s)
positive and at most 70000: true
