@@ -10,6 +10,9 @@ import org.springframework.stereotype.Service; | |||
import java.util.List; | |||
import java.util.concurrent.TimeUnit; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.EX; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.NX; | |||
@Service @Slf4j | |||
public class ActivationCodeService { | |||
@@ -31,7 +34,7 @@ public class ActivationCodeService { | |||
} | |||
public void define (String key, int quantity, long expirationSeconds) { | |||
redis.set_plaintext(key, String.valueOf(quantity), "NX", "EX", expirationSeconds); | |||
redis.set_plaintext(key, String.valueOf(quantity), NX, EX, expirationSeconds); | |||
} | |||
public List<String> getClaimants (String key) { return redis.list(getClaimantsKey(key)); } | |||
@@ -13,6 +13,8 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; | |||
import static org.cobbzilla.util.json.JsonUtil.fromJsonOrDie; | |||
import static org.cobbzilla.util.json.JsonUtil.toJsonOrDie; | |||
import static org.cobbzilla.util.reflect.ReflectionUtil.getFirstTypeParam; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.NX; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.XX; | |||
@AllArgsConstructor | |||
public class RedisMap<V> implements Map<String, V> { | |||
@@ -46,8 +48,8 @@ public class RedisMap<V> implements Map<String, V> { | |||
} else if (duration == null) { | |||
redis.set(keyName(key), toJsonOrDie(value)); | |||
} else { | |||
redis.set(keyName(key), toJsonOrDie(value), "NX", "PX", duration); | |||
redis.set(keyName(key), toJsonOrDie(value), "XX", "PX", duration); | |||
redis.set(keyName(key), toJsonOrDie(value), NX, "PX", duration); | |||
redis.set(keyName(key), toJsonOrDie(value), XX, "PX", duration); | |||
} | |||
return null; | |||
} | |||
@@ -27,6 +27,10 @@ public class RedisService { | |||
public static final int MAX_RETRIES = 5; | |||
public static final String EX = "EX"; | |||
public static final String XX = "XX"; | |||
public static final String NX = "NX"; | |||
@Autowired @Getter @Setter private HasRedisConfiguration configuration; | |||
@Getter @Setter private String key; | |||
@@ -118,8 +122,8 @@ public class RedisService { | |||
} | |||
public void set(String key, String value, String expx, long time) { | |||
__set(key, value, "XX", expx, time, 0, MAX_RETRIES); | |||
__set(key, value, "NX", expx, time, 0, MAX_RETRIES); | |||
__set(key, value, XX, expx, time, 0, MAX_RETRIES); | |||
__set(key, value, NX, expx, time, 0, MAX_RETRIES); | |||
} | |||
public void set(String key, String value) { __set(key, value, 0, MAX_RETRIES); } | |||
@@ -215,7 +219,7 @@ public class RedisService { | |||
String lockVal = get(key); | |||
final long start = now(); | |||
while ((lockVal == null || !lockVal.equals(uuid)) && (now() - start < lockTimeout)) { | |||
set(key, uuid, "NX", "EX", deadlockTimeout); | |||
set(key, uuid, NX, EX, deadlockTimeout); | |||
lockVal = get(key); | |||
} | |||
if (lockVal == null || !lockVal.equals(uuid)) return die("lock: timeout locking "+key); | |||
@@ -15,6 +15,7 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.notSupported; | |||
import static org.cobbzilla.util.json.JsonUtil.fromJsonOrDie; | |||
import static org.cobbzilla.util.json.JsonUtil.toJsonOrDie; | |||
import static org.cobbzilla.util.reflect.ReflectionUtil.getTypeParameter; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.*; | |||
public abstract class AbstractRedisDAO<E extends ExpirableBase> implements DAO<E> { | |||
@@ -63,8 +64,8 @@ public abstract class AbstractRedisDAO<E extends ExpirableBase> implements DAO<E | |||
@Override public E update(@Valid E entity) { | |||
if (entity.shouldExpire()) { | |||
getRedis().set(entity.getUuid(), toJsonOrDie(entity), "XX", "EX", entity.getExpirationSeconds()); | |||
getRedis().set(entity.getUuid(), toJsonOrDie(entity), "NX", "EX", entity.getExpirationSeconds()); | |||
getRedis().set(entity.getUuid(), toJsonOrDie(entity), XX, EX, entity.getExpirationSeconds()); | |||
getRedis().set(entity.getUuid(), toJsonOrDie(entity), NX, EX, entity.getExpirationSeconds()); | |||
} else { | |||
getRedis().set(entity.getUuid(), toJsonOrDie(entity)); | |||
} | |||
@@ -80,7 +81,8 @@ public abstract class AbstractRedisDAO<E extends ExpirableBase> implements DAO<E | |||
for (E entity : entities) getRedis().del(entity.getUuid()); | |||
} | |||
public String getMetadata (String key) { return getRedis().get("__metadata_"+key); } | |||
public void setMetadata (String key, String value) { getRedis().set("__metadata_"+key, value); } | |||
public static final String METADATA_PREFIX = "__metadata_"; | |||
public String getMetadata (String key) { return getRedis().get(METADATA_PREFIX+key); } | |||
public void setMetadata (String key, String value) { getRedis().set(METADATA_PREFIX+key, value); } | |||
} |
@@ -12,6 +12,7 @@ import static java.util.UUID.randomUUID; | |||
import static java.util.concurrent.TimeUnit.DAYS; | |||
import static org.cobbzilla.util.daemon.ZillaRuntime.empty; | |||
import static org.cobbzilla.util.reflect.ReflectionUtil.getFirstTypeParam; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.*; | |||
import static org.cobbzilla.wizard.resources.ResourceUtil.forbiddenEx; | |||
@Slf4j | |||
@@ -62,7 +63,7 @@ public abstract class AbstractSessionDAO<T extends Identifiable> { | |||
} | |||
private void rawSet(String uuid, T thing, boolean shouldExist) { | |||
getSessionRedis().set(uuid, toJson(thing), shouldExist ? "XX" : "NX", "EX", getSessionTimeout(thing)); | |||
getSessionRedis().set(uuid, toJson(thing), shouldExist ? XX : NX, EX, getSessionTimeout(thing)); | |||
} | |||
private long getSessionTimeout(T thing) { return getSessionTimeout(); } | |||
@@ -12,6 +12,7 @@ import org.cobbzilla.wizard.model.shard.Shardable; | |||
import java.util.concurrent.TimeUnit; | |||
import static org.cobbzilla.util.json.JsonUtil.toJsonOrDie; | |||
import static org.cobbzilla.wizard.cache.redis.RedisService.EX; | |||
import static org.cobbzilla.wizard.dao.shard.AbstractShardedDAO.NULL_CACHE; | |||
@AllArgsConstructor @Accessors(chain=true) | |||
@@ -32,16 +33,16 @@ public abstract class ShardCacheableFinder<E extends Shardable, D extends Single | |||
if (json == null) { | |||
entity = (E) find(args); | |||
if (entity == null) { | |||
shardedDAO.getShardCache().set(cacheKey, NULL_CACHE, "EX", getCacheTimeoutSeconds()); | |||
shardedDAO.getShardCache().set(cacheKey, NULL_CACHE, EX, getCacheTimeoutSeconds()); | |||
final String cacheRefsKey = shardedDAO.getCacheRefsKey(NULL_CACHE); | |||
shardedDAO.getShardCache().lpush(cacheRefsKey, cacheKey); | |||
} else { | |||
shardedDAO.getShardCache().set(cacheKey, toJsonOrDie(entity), "EX", getCacheTimeoutSeconds()); | |||
shardedDAO.getShardCache().set(cacheKey, toJsonOrDie(entity), EX, getCacheTimeoutSeconds()); | |||
shardedDAO.getShardCache().lpush(shardedDAO.getCacheRefsKey(entity.getUuid()), cacheKey); | |||
} | |||
} else if (!json.equals(NULL_CACHE)) { | |||
entity = JsonUtil.fromJsonOrDie(json, shardedDAO.getEntityClass()); | |||
shardedDAO.getShardCache().set(cacheKey, json, "EX", getCacheTimeoutSeconds()); | |||
shardedDAO.getShardCache().set(cacheKey, json, EX, getCacheTimeoutSeconds()); | |||
} | |||
return entity; | |||
} | |||