io.odpf.depot.redis.client.RedisStandaloneClient Maven / Gradle / Ivy
package io.odpf.depot.redis.client;
import io.odpf.depot.metrics.Instrumentation;
import io.odpf.depot.redis.client.response.RedisResponse;
import io.odpf.depot.redis.client.response.RedisStandaloneResponse;
import io.odpf.depot.redis.record.RedisRecord;
import io.odpf.depot.redis.ttl.RedisTtl;
import lombok.AllArgsConstructor;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import java.util.List;
import java.util.stream.Collectors;
/**
* Redis standalone client.
*/
@AllArgsConstructor
public class RedisStandaloneClient implements RedisClient {
private final Instrumentation instrumentation;
private final RedisTtl redisTTL;
private final Jedis jedis;
/**
* Pushes records in a transaction.
* if the transaction fails, whole batch can be retried.
*
* @param records records to send
* @return Custom response containing status of the API calls.
*/
@Override
public List send(List records) {
Pipeline jedisPipelined = jedis.pipelined();
jedisPipelined.multi();
List responses = records.stream()
.map(redisRecord -> redisRecord.send(jedisPipelined, redisTTL))
.collect(Collectors.toList());
Response> executeResponse = jedisPipelined.exec();
jedisPipelined.sync();
instrumentation.logDebug("jedis responses: {}", executeResponse.get());
return responses.stream().map(RedisStandaloneResponse::process).collect(Collectors.toList());
}
@Override
public void close() {
instrumentation.logInfo("Closing Jedis client");
jedis.close();
}
}