이 튜토리얼에서는 Java 클라이언트 라이브러리인 Jedis를 사용하여 Redis의 리스트(List) 값에 대해 생성(Create), 조회(Read), 수정(Update), 삭제(Delete) 작업을 수행하는 방법을 단계별로 알아봅니다.
Jedis 라이브러리란?
Jedis는 Redis 데이터스토어를 위한 Java 클라이언트 라이브러리입니다. 크기가 작고 사용법이 매우 간단하며, Redis 2.8.x, 3.x.x 및 그 이상 버전과 완전히 호환됩니다. 별도의 복잡한 설정 없이도 Java 애플리케이션에서 Redis의 다양한 자료구조를 손쉽게 다룰 수 있다는 것이 가장 큰 장점입니다.
Redis 리스트(List) 값이란?
리스트는 삽입 순서대로 정렬된 문자열의 시퀀스입니다. Redis에서는 리스트를 값(value)으로 저장할 수 있으며, 다양한 Redis 명령어를 통해 저장, 관리, 조회가 가능합니다. 리스트는 스택(Stack)이나 큐(Queue)처럼 활용할 수 있어 메시지 큐, 최근 본 항목 목록 등을 구현할 때 유용하게 사용됩니다.
프로젝트 설정
선호하는 IDE에서 간단한 Maven 프로젝트를 생성한 뒤, pom.xml 파일에 아래 의존성을 추가합니다.
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.1</version> </dependency>
최신 버전의 Jedis 라이브러리는 Maven Central Repository 페이지에서 확인할 수 있습니다.
Redis 설치
실습을 진행하려면 최신 버전의 Redis가 설치되어 있어야 합니다. 운영체제별 설치 방법은 Redis 공식 문서를 참고하세요.
Jedis 연결 설정
Java 코드를 Redis 서버에 연결하려면 redis.clients.jedis.Jedis 클래스의 객체를 생성합니다.
Jedis jedis = new Jedis();
로컬 머신에서 기본 포트(6379)로 Redis 서비스를 실행 중이라면 기본 생성자만으로 충분합니다. 만약 다른 호스트나 포트를 사용한다면 생성자에 올바른 호스트 URL과 포트 번호를 인자로 전달해야 합니다.
// 특정 호스트와 포트로 연결하는 경우
Jedis jedis = new Jedis("localhost", 6379);
생성 및 추가 (Create & Add)
Jedis 라이브러리는 리스트 값을 생성하고 요소를 삽입하기 위한 여러 메서드를 제공합니다. 주요 메서드는 다음과 같습니다.
- lpush : 리스트의 머리(head, 왼쪽)에 하나 이상의 요소를 삽입합니다. 리스트가 존재하지 않으면 먼저 빈 리스트를 가진 키를 생성한 후 삽입을 수행합니다.
/* 새 리스트를 생성하고 문자열 a, b, c를 머리에 삽입 */ jedis.lpush("list-1", "a", "b", "c"); /* 새 리스트를 생성하고 문자열 1, 2의 바이트 배열을 머리에 삽입 */ jedis.lpush("list-2".getBytes(), new BigInteger("1").toByteArray(), new BigInteger("2").toByteArray()); - rpush : 리스트의 꼬리(tail, 오른쪽)에 하나 이상의 요소를 삽입합니다. 리스트가 존재하지 않으면 먼저 빈 리스트를 가진 키를 생성한 후 삽입을 수행합니다.
/* 새 리스트를 생성하고 문자열 a, b, c를 꼬리에 삽입 */ jedis.rpush("list-3", "a", "b", "c"); /* 새 리스트를 생성하고 문자열 1, 2의 바이트 배열을 꼬리에 삽입 */ jedis.rpush("list-4".getBytes(), new BigInteger("1").toByteArray(), new BigInteger("2").toByteArray()); - lpushx : 리스트가 이미 존재하는 경우에만 머리에 하나 이상의 요소를 삽입합니다. 키가 없으면 아무 작업도 수행하지 않습니다.
/* <list-1> 리스트의 머리에 문자열 d, e 삽입 */ jedis.lpushx("list-1", "d", "e"); /* <list-2> 리스트의 머리에 문자열 3, 4의 바이트 배열 삽입 */ jedis.lpushx("list-2".getBytes(), new BigInteger("3").toByteArray(), new BigInteger("4").toByteArray()); - rpushx : 리스트가 이미 존재하는 경우에만 꼬리에 하나 이상의 요소를 삽입합니다.
/* <list-3> 리스트의 꼬리에 문자열 d, e 삽입 */ jedis.rpushx("list-3", "d", "e"); /* <list-4> 리스트의 꼬리에 문자열 3, 4의 바이트 배열 삽입 */ jedis.rpushx("list-4".getBytes(), new BigInteger("3").toByteArray(), new BigInteger("4").toByteArray());
제거 및 반환 (Remove & Return)
리스트 값에 대해 스택처럼 pop 연산을 수행하는 두 가지 메서드가 있습니다.
- lpop : 리스트의 첫 번째 요소를 제거하고 반환합니다.
/* <list-1>의 머리에서 요소 하나를 제거하고 반환 */ jedis.lpop("list-1"); /* <list-2>의 머리에서 요소 하나를 제거하고 반환 */ jedis.lpop("list-2".getBytes()); - rpop : 리스트의 마지막 요소를 제거하고 반환합니다.
/* <list-3>의 꼬리에서 요소 하나를 제거하고 반환 */ jedis.rpop("list-3"); /* <list-4>의 꼬리에서 요소 하나를 제거하고 반환 */ jedis.rpop("list-4".getBytes());
길이 확인 (Length)
llen 메서드는 키에 저장된 리스트 값의 길이(요소 개수)를 반환합니다.
/* <list-1>의 크기 반환 */
jedis.llen("list-1");
/* <list-2>의 크기 반환 */
jedis.llen("list-2".getBytes());
요소 삭제 (Delete)
lrem 메서드는 리스트 값에서 지정한 개수만큼 해당 요소의 등장 횟수를 삭제합니다. count 인자가 양수면 머리부터, 음수면 꼬리부터 탐색하며, 0이면 모든 등장 횟수를 제거합니다.
/* <list-1>에서 요소 a를 1개 제거 */
jedis.lrem("list-1", 1, "a");
/* <list-2>에서 요소 1을 2개 제거 */
jedis.lrem("list-2".getBytes(), 2, "1".getBytes());
인덱스로 조회 (Get By Index)
lindex 메서드는 인덱스를 인자로 받아 해당 위치의 요소를 반환합니다. 인덱스는 0부터 시작하며, 음수 인덱스는 꼬리부터 계산됩니다(-1은 마지막 요소).
/* <list-1>에서 인덱스 3의 요소 조회 */
jedis.lindex("list-1", 3);
/* <list-2>에서 인덱스 2의 요소 조회 */
jedis.lindex("list-2".getBytes(), 2);
인덱스로 수정 (Update By Index)
lset 메서드는 인덱스 위치의 요소를 새 값으로 교체합니다.
/* <list-1>의 인덱스 3 위치에 요소 g 설정 */
jedis.lset("list-1", 3, "g");
/* <list-2>의 인덱스 2 위치에 요소 6 설정 */
jedis.lset("list-2".getBytes(), 2, "6".getBytes());
여러 요소 한 번에 조회 (Get Multiple Elements)
lrange 메서드는 시작 오프셋과 끝 오프셋으로 지정된 범위의 하나 이상의 요소를 반환합니다. 끝 오프셋에 -1을 지정하면 마지막 요소까지 전체를 의미합니다.
/* <list-1>에서 인덱스 1부터 5까지의 요소 반환 */
jedis.lrange("list-1", 1, 5);
/* <list-2>의 전체 요소 반환 */
jedis.lrange("list-2".getBytes(), 0, -1);
참고 자료
- Redis 공식 문서 – List Command Docs
지금까지 Jedis 라이브러리를 사용하여 Redis 리스트 값에 CRUD 작업을 수행하는 방법을 살펴보았습니다. 내용이 도움이 되었다면 댓글로 의견을 남겨주시고, 주변에도 공유해 주세요!