|
10 | 10 |
|
11 | 11 | import redis.clients.jedis.Jedis; |
12 | 12 | import redis.clients.jedis.JedisPool; |
| 13 | +import redis.clients.jedis.Transaction; |
13 | 14 |
|
14 | 15 | public class SiteStatsDaoRedisImpl implements SiteStatsDao { |
15 | 16 |
|
@@ -47,7 +48,7 @@ public void update(MeterReading reading) { |
47 | 48 | ZonedDateTime day = reading.getDateTime(); |
48 | 49 | String key = RedisSchema.getSiteStatsKey(siteId, day); |
49 | 50 |
|
50 | | - updateBasic(jedis, key, reading); |
| 51 | + updateOptimized(jedis, key, reading); |
51 | 52 | } |
52 | 53 | } |
53 | 54 |
|
@@ -81,6 +82,18 @@ private void updateBasic(Jedis jedis, String key, MeterReading reading) { |
81 | 82 | // Challenge #3 |
82 | 83 | private void updateOptimized(Jedis jedis, String key, MeterReading reading) { |
83 | 84 | // START Challenge #3 |
| 85 | + try (Transaction t = jedis.multi()) { |
| 86 | + String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString(); |
| 87 | + t.hset(key, SiteStats.reportingTimeField, reportingTime); |
| 88 | + t.hincrBy(key, SiteStats.countField, 1); |
| 89 | + t.expire(key, weekSeconds); |
| 90 | + |
| 91 | + compareAndUpdateScript.updateIfGreater(t, key, SiteStats.maxWhField, reading.getWhGenerated()); |
| 92 | + compareAndUpdateScript.updateIfLess(t, key, SiteStats.minWhField, reading.getWhGenerated()); |
| 93 | + compareAndUpdateScript.updateIfGreater(t, key, SiteStats.maxCapacityField, getCurrentCapacity(reading)); |
| 94 | + |
| 95 | + t.exec(); |
| 96 | + } |
84 | 97 | // END Challenge #3 |
85 | 98 | } |
86 | 99 |
|
|
0 commit comments