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 32c2aba..1cdb717 100644 --- a/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java +++ b/src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java @@ -10,6 +10,7 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import redis.clients.jedis.Transaction; public class SiteStatsDaoRedisImpl implements SiteStatsDao { @@ -47,7 +48,7 @@ public void update(MeterReading reading) { ZonedDateTime day = reading.getDateTime(); String key = RedisSchema.getSiteStatsKey(siteId, day); - updateBasic(jedis, key, reading); + updateOptimized(jedis, key, reading); } } @@ -81,6 +82,18 @@ private void updateBasic(Jedis jedis, String key, MeterReading reading) { // Challenge #3 private void updateOptimized(Jedis jedis, String key, MeterReading reading) { // START Challenge #3 + try (Transaction t = jedis.multi()) { + String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString(); + t.hset(key, SiteStats.reportingTimeField, reportingTime); + t.hincrBy(key, SiteStats.countField, 1); + t.expire(key, weekSeconds); + + compareAndUpdateScript.updateIfGreater(t, key, SiteStats.maxWhField, reading.getWhGenerated()); + compareAndUpdateScript.updateIfLess(t, key, SiteStats.minWhField, reading.getWhGenerated()); + compareAndUpdateScript.updateIfGreater(t, key, SiteStats.maxCapacityField, getCurrentCapacity(reading)); + + t.exec(); + } // END Challenge #3 }