5
5
import com .redislabs .university .RU102J .script .CompareAndUpdateScript ;
6
6
import redis .clients .jedis .Jedis ;
7
7
import redis .clients .jedis .JedisPool ;
8
+ import redis .clients .jedis .Pipeline ;
8
9
import redis .clients .jedis .Transaction ;
9
10
10
11
import java .time .ZoneOffset ;
11
12
import java .time .ZonedDateTime ;
12
13
import java .util .Map ;
13
14
15
+ import static com .redislabs .university .RU102J .api .SiteStats .*;
16
+
14
17
public class SiteStatsDaoRedisImpl implements SiteStatsDao {
15
18
16
19
private final int weekSeconds = 60 * 60 * 24 * 7 ;
@@ -47,16 +50,16 @@ public void update(MeterReading reading) {
47
50
ZonedDateTime day = reading .getDateTime ();
48
51
String key = RedisSchema .getSiteStatsKey (siteId , day );
49
52
50
- updateBasic (jedis , key , reading );
53
+ updateOptimized (jedis , key , reading );
51
54
}
52
55
}
53
56
54
57
// A naive implementation of update. This implementation has
55
58
// potential race conditions and makes several round trips to Redis.
56
59
private void updateBasic (Jedis jedis , String key , MeterReading reading ) {
57
60
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 );
60
63
jedis .expire (key , weekSeconds );
61
64
62
65
String maxWh = jedis .hget (key , SiteStats .maxWhField );
@@ -81,6 +84,18 @@ private void updateBasic(Jedis jedis, String key, MeterReading reading) {
81
84
// Challenge #3
82
85
private void updateOptimized (Jedis jedis , String key , MeterReading reading ) {
83
86
// 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
+ }
84
99
// END Challenge #3
85
100
}
86
101
0 commit comments