migrate token bucket redis record format from json to hash: phase 2

This commit is contained in:
Sergey Skrobotov
2023-03-16 01:41:48 -07:00
parent a04fe133b6
commit c14ef7e6cf
4 changed files with 71 additions and 60 deletions

View File

@@ -10,6 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.whispersystems.textsecuregcm.util.redis.RedisLuaScriptSandbox.tail;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
@@ -19,7 +20,7 @@ public class BaseRedisCommandsHandler implements RedisCommandsHandler {
@Override
public Object redisCommand(final String command, final List<Object> args) {
return switch (command) {
return switch (command.toUpperCase(Locale.ROOT)) {
case "SET" -> {
assertTrue(args.size() > 2);
yield set(args.get(0).toString(), args.get(1).toString(), tail(args, 2));
@@ -33,13 +34,18 @@ public class BaseRedisCommandsHandler implements RedisCommandsHandler {
yield del(args.stream().map(Object::toString).toList());
}
case "HSET" -> {
assertTrue(args.size() >= 3);
yield hset(args.get(0).toString(), args.get(1).toString(), args.get(2).toString(), tail(args, 3));
assertTrue(args.size() > 1);
assertTrue(args.size() % 2 == 1);
yield hset(args.get(0).toString(), tail(args, 1));
}
case "HGET" -> {
assertEquals(2, args.size());
yield hget(args.get(0).toString(), args.get(1).toString());
}
case "HMGET" -> {
assertTrue(args.size() > 1);
yield hmget(args.get(0).toString(), tail(args, 1));
}
case "PEXPIRE" -> {
assertEquals(2, args.size());
yield pexpire(args.get(0).toString(), Double.valueOf(args.get(1).toString()).longValue(), tail(args, 2));
@@ -85,7 +91,7 @@ public class BaseRedisCommandsHandler implements RedisCommandsHandler {
return 0;
}
public Object hset(final String key, final String field, final String value, final List<Object> other) {
public Object hset(final String key, final List<Object> fieldsAndValues) {
return "OK";
}
@@ -93,6 +99,10 @@ public class BaseRedisCommandsHandler implements RedisCommandsHandler {
return null;
}
public Object[] hmget(final String key, final List<Object> fields) {
return new Object[fields.size()];
}
public Object set(final String key, final String value, final List<Object> tail) {
return "OK";
}

View File

@@ -6,6 +6,7 @@
package org.whispersystems.textsecuregcm.util.redis;
import java.time.Clock;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -46,13 +47,18 @@ public class SimpleCacheCommandsHandler extends BaseRedisCommandsHandler {
@SuppressWarnings("unchecked")
@Override
public Object hset(final String key, final String field, final String value, final List<Object> other) {
public Object hset(final String key, final List<Object> fieldsAndValues) {
Map<Object, Object> map = getIfNotExpired(key, Map.class);
if (map == null) {
map = new ConcurrentHashMap<>();
cache.put(key, new Entry(map, Long.MAX_VALUE));
}
map.put(field, value);
final Iterator<Object> iter = fieldsAndValues.iterator();
while (iter.hasNext()) {
final Object k = iter.next();
final Object v = iter.next();
map.put(k, v);
}
return "OK";
}
@@ -62,6 +68,15 @@ public class SimpleCacheCommandsHandler extends BaseRedisCommandsHandler {
return map == null ? null : map.get(field);
}
@Override
public Object[] hmget(final String key, final List<Object> fields) {
final Object[] res = new Object[fields.size()];
for (int i = 0; i < fields.size(); i++) {
res[i] = hget(key, fields.get(i).toString());
}
return res;
}
@SuppressWarnings("unchecked")
@Override
public Object push(final boolean left, final String key, final List<Object> values) {