DB/Redis

[Redis-Jedis] Pipeline을 이용한 다량의 데이터 Insert하기

louis.dev 2013. 11. 19. 21:10

대량의 데이터를 레디스에 저장해야 할때는 Pipeline을 이용하면 단순히 set command보다 월등한 성능을 보장받을 수 있습니다.


사용은 간단합니다.

@Autowired protected ShardedJedisPool redisPool;
public void setByPipeline(Map<string, string> map) {
	ShardedJedis jedis = null;
	try {
		jedis = redisPool.getResource();
		ShardedJedisPipeline pipeline =  jedis.pipelined();
		
		for(String key : map.keySet()) {
			
			pipeline.set(key, map.get(key));
		}
		pipeline.sync();
	} catch (JedisConnectionException e) {
		if (jedis != null) redisPool.returnBrokenResource(jedis); // 접속이 끊긴 리소스 반환
	} finally {
		if (jedis != null) redisPool.returnResource(jedis);
	}
}

pipeline에 삽입하고자 하는 데이터를 set을 먼저해줍니다. 이때 set커맨드는 실제로 데이터를 서버로 전송하지 않고 12번째 줄인 pipeline.sync()를 콜한후에 실제 데이터를 서버로 전송하여 저장하게 됩니다.


파이프라인 방식은 명령어 자체를 파일로 쓴후 해당 파일을 레디스 서버로 전송하여 대용량 삽입을 빠르게 할수 있게 합니다.


테스트 결과 단순 데이터 5000건을 set 해봤더니 약 200ms 정도 걸리네요~