From e24ead3fda47ea90aec5065a7104aa971b2fb20c Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Fri, 29 May 2020 22:14:26 -0700 Subject: [PATCH] Challenge #7 solution and tests. --- .../dao/RateLimiterSlidingDaoRedisImpl.java | 22 +++++++++++++++++++ .../RateLimiterSlidingDaoRedisImplTest.java | 3 --- 2 files changed, 22 insertions(+), 3 deletions(-) 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..a903568 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,13 @@ 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 +26,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 } } diff --git a/src/test/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImplTest.java b/src/test/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImplTest.java index e1a35ec..e69913d 100644 --- a/src/test/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImplTest.java +++ b/src/test/java/com/redislabs/university/RU102J/dao/RateLimiterSlidingDaoRedisImplTest.java @@ -37,7 +37,6 @@ public void flush() { keyManager.deleteKeys(jedis); } - @Ignore @Test public void hit() { int exceptionCount = 0; @@ -54,7 +53,6 @@ public void hit() { assertThat(exceptionCount, is(0)); } - @Ignore @Test public void hitOutsideLimit() { int exceptionCount = 0; @@ -71,7 +69,6 @@ public void hitOutsideLimit() { assertThat(exceptionCount, is(2)); } - @Ignore @Test public void hitOutsideWindow() throws InterruptedException { int exceptionCount = 0;