Skip to content

Commit 4ff6726

Browse files
committed
1 parent 400e537 commit 4ff6726

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

src/main/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImpl.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
import com.redislabs.university.RU102J.script.CompareAndUpdateScript;
66
import redis.clients.jedis.Jedis;
77
import redis.clients.jedis.JedisPool;
8+
import redis.clients.jedis.Pipeline;
89
import redis.clients.jedis.Transaction;
910

1011
import java.time.ZoneOffset;
1112
import java.time.ZonedDateTime;
1213
import java.util.Map;
1314

15+
import static com.redislabs.university.RU102J.api.SiteStats.*;
16+
1417
public class SiteStatsDaoRedisImpl implements SiteStatsDao {
1518

1619
private final int weekSeconds = 60 * 60 * 24 * 7;
@@ -47,16 +50,16 @@ public void update(MeterReading reading) {
4750
ZonedDateTime day = reading.getDateTime();
4851
String key = RedisSchema.getSiteStatsKey(siteId, day);
4952

50-
updateBasic(jedis, key, reading);
53+
updateOptimized(jedis, key, reading);
5154
}
5255
}
5356

5457
// A naive implementation of update. This implementation has
5558
// potential race conditions and makes several round trips to Redis.
5659
private void updateBasic(Jedis jedis, String key, MeterReading reading) {
5760
String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString();
58-
jedis.hset(key, SiteStats.reportingTimeField, reportingTime);
59-
jedis.hincrBy(key, SiteStats.countField, 1);
61+
jedis.hset(key, reportingTimeField, reportingTime);
62+
jedis.hincrBy(key, countField, 1);
6063
jedis.expire(key, weekSeconds);
6164

6265
String maxWh = jedis.hget(key, SiteStats.maxWhField);
@@ -81,6 +84,18 @@ private void updateBasic(Jedis jedis, String key, MeterReading reading) {
8184
// Challenge #3
8285
private void updateOptimized(Jedis jedis, String key, MeterReading reading) {
8386
// START Challenge #3
87+
String reportingTime = ZonedDateTime.now(ZoneOffset.UTC).toString();
88+
try (Transaction transaction = jedis.multi()) {
89+
transaction.hset(key, reportingTimeField, reportingTime);
90+
transaction.hincrBy(key, countField, 1);
91+
transaction.expire(key, weekSeconds);
92+
93+
compareAndUpdateScript.updateIfGreater(transaction, key, maxWhField, reading.getWhGenerated());
94+
compareAndUpdateScript.updateIfLess(transaction, key, minWhField, reading.getWhGenerated());
95+
compareAndUpdateScript.updateIfGreater(transaction, key, maxCapacityField, getCurrentCapacity(reading));
96+
97+
transaction.exec();
98+
}
8499
// END Challenge #3
85100
}
86101

src/test/java/com/redislabs/university/RU102J/dao/SiteStatsDaoRedisImplTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public void flush() {
4848
}
4949

5050
@Test
51+
@Ignore
5152
public void homework23() {
5253
jedis.set("a", "foo");
5354
jedis.set("b", "bar");

0 commit comments

Comments
 (0)