package core.framework.impl.redis;
import core.framework.api.log.ActionLogContext;
import core.framework.api.redis.RedisSet;
import core.framework.api.util.StopWatch;
import core.framework.impl.resource.PoolItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.BinaryJedis;
import redis.clients.jedis.exceptions.JedisConnectionException;
import java.util.HashSet;
import java.util.Set;
/**
* @author neo
*/
public final class RedisSetImpl implements RedisSet {
private final Logger logger = LoggerFactory.getLogger(RedisSetImpl.class);
private final RedisImpl redis;
public RedisSetImpl(RedisImpl redis) {
this.redis = redis;
}
@Override
public boolean add(String key, String value) {
StopWatch watch = new StopWatch();
PoolItem<BinaryJedis> item = redis.pool.borrowItem();
try {
Long reply = item.resource.sadd(redis.encode(key), redis.encode(value));
return reply == 1;
} catch (JedisConnectionException e) {
item.broken = true;
throw e;
} finally {
redis.pool.returnItem(item);
long elapsedTime = watch.elapsedTime();
ActionLogContext.track("redis", elapsedTime);
logger.debug("sadd, key={}, value={}, elapsedTime={}", key, value, elapsedTime);
redis.checkSlowOperation(elapsedTime);
}
}
@Override
public Set<String> members(String key) {
StopWatch watch = new StopWatch();
PoolItem<BinaryJedis> item = redis.pool.borrowItem();
try {
Set<byte[]> redisMembers = item.resource.smembers(redis.encode(key));
Set<String> members = new HashSet<>(redisMembers.size());
for (byte[] redisMember : redisMembers) {
members.add(redis.decode(redisMember));
}
return members;
} catch (JedisConnectionException e) {
item.broken = true;
throw e;
} finally {
redis.pool.returnItem(item);
long elapsedTime = watch.elapsedTime();
ActionLogContext.track("redis", elapsedTime);
logger.debug("smembers, key={}, elapsedTime={}", key, elapsedTime);
redis.checkSlowOperation(elapsedTime);
}
}
@Override
public boolean isMember(String key, String value) {
StopWatch watch = new StopWatch();
PoolItem<BinaryJedis> item = redis.pool.borrowItem();
try {
return item.resource.sismember(redis.encode(key), redis.encode(value));
} catch (JedisConnectionException e) {
item.broken = true;
throw e;
} finally {
redis.pool.returnItem(item);
long elapsedTime = watch.elapsedTime();
ActionLogContext.track("redis", elapsedTime);
logger.debug("sismember, key={}, value={}, elapsedTime={}", key, value, elapsedTime);
redis.checkSlowOperation(elapsedTime);
}
}
@Override
public boolean remove(String key, String... values) {
StopWatch watch = new StopWatch();
PoolItem<BinaryJedis> item = redis.pool.borrowItem();
try {
Long reply = item.resource.srem(redis.encode(key), redis.encode(values));
return reply == 1;
} catch (JedisConnectionException e) {
item.broken = true;
throw e;
} finally {
redis.pool.returnItem(item);
long elapsedTime = watch.elapsedTime();
ActionLogContext.track("redis", elapsedTime);
logger.debug("srem, key={}, values={}, elapsedTime={}", key, values, elapsedTime);
redis.checkSlowOperation(elapsedTime);
}
}
}