From 4ff6726e9df045e242012aced4c573c32bfa2b34 Mon Sep 17 00:00:00 2001 From: mate0021 Date: Thu, 10 Mar 2022 21:34:25 +0100 Subject: [PATCH] Challenge #3 --- .../RU102J/dao/SiteStatsDaoRedisImpl.java | 21 ++++++++++++++++--- .../RU102J/dao/SiteStatsDaoRedisImplTest.java | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java b/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java index 1da030f..a68daf6 100644 --- a/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java +++ b/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java @@ -5,12 +5,15 @@ import com.redislabs.university.RU102J.script.CompareAndUpdateScript; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import redis.clients.jedis.Pipeline; import redis.clients.jedis.Transaction; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Map; +import static com.redislabs.university.RU102J.api.SiteStats.*; + public class SiteStatsDaoRedisImpl implements SiteStatsDao { private final int weekSeconds = 60 * 60 * 24 * 7; @@ -47,7 +50,7 @@ public void update(MeterReading reading) { ZonedDateTime day = reading.getDateTime(); String key = RedisSchema.getSiteStatsKey(siteId, day); - updateBasic(jedis, key, reading); + updateOptimized(jedis, key, reading); } } @@ -55,8 +58,8 @@ public void update(MeterReading reading) { // potential race conditions and makes several round trips to Redis. private void updateBasic(Jedis jedis, String key, MeterReading reading) { String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString(); - jedis.hset(key, SiteStats.reportingTimeField, reportingTime); - jedis.hincrBy(key, SiteStats.countField, 1); + jedis.hset(key, reportingTimeField, reportingTime); + jedis.hincrBy(key, countField, 1); jedis.expire(key, weekSeconds); String maxWh = jedis.hget(key, SiteStats.maxWhField); @@ -81,6 +84,18 @@ private void updateBasic(Jedis jedis, String key, MeterReading reading) { // Challenge #3 private void updateOptimized(Jedis jedis, String key, MeterReading reading) { // START Challenge #3 + String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString(); + try (Transaction transaction = jedis.multi()) { + transaction.hset(key, reportingTimeField, reportingTime); + transaction.hincrBy(key, countField, 1); + transaction.expire(key, weekSeconds); + + compareAndUpdateScript.updateIfGreater(transaction, key, maxWhField, reading.getWhGenerated()); + compareAndUpdateScript.updateIfLess(transaction, key, minWhField, reading.getWhGenerated()); + compareAndUpdateScript.updateIfGreater(transaction, key, maxCapacityField, getCurrentCapacity(reading)); + + transaction.exec(); + } // END Challenge #3 } diff --git a/src/test/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImplTest.java b/src/test/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImplTest.java index 2e4fad2..d6b6e3c 100644 --- a/src/test/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImplTest.java +++ b/src/test/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImplTest.java @@ -48,6 +48,7 @@ public void flush() { } @Test + @Ignore public void homework23() { jedis.set("a", "foo"); jedis.set("b", "bar");