From 023a608c38be3bbdaee75a192fd35ca9eff8d3d8 Mon Sep 17 00:00:00 2001 From: victoriaum Date: Tue, 7 Feb 2023 11:09:49 +0900 Subject: [PATCH] challenge #7 --- .../dao/RateLimiterSlidingDaoRedisImpl.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImpl.java b/src/main/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImpl.java index a1b1947..1dbdfea 100644 --- a/src/main/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImpl.java +++ b/src/main/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImpl.java @@ -1,6 +1,12 @@ package com.redislabs.university.RU102J.dao; +import com.redislabs.university.RU102J.core.KeyHelper; +import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import redis.clients.jedis.Response; +import redis.clients.jedis.Transaction; + +import java.time.ZonedDateTime; public class RateLimiterSlidingDaoRedisImpl implements RateLimiter { @@ -19,6 +25,21 @@ public RateLimiterSlidingDaoRedisImpl(JedisPool pool, long windowSizeMS, @Override public void hit(String name) throws RateLimitExceededException { // START CHALLENGE #7 + try (Jedis jedis = jedisPool.getResource()) { + String key = KeyHelper.getKey("limiter:" + windowSizeMS + ":" + name + ":" + maxHits); + long now = ZonedDateTime.now().toInstant().toEpochMilli(); + + Transaction t = jedis.multi(); + String member = now + "-" + Math.random(); + t.zadd(key, now, member); + t.zremrangeByScore(key, 0, now - windowSizeMS); + Response hits = t.zcard(key); + t.exec(); + + if (hits.get() > maxHits) { + throw new RateLimitExceededException(); + } + } // END CHALLENGE #7 } }