Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

Redis 입문 가이드: 설치부터 핵심 데이터 구조와 기본 명령어까지

Redis 입문 가이드: 설치부터 핵심 데이터 구조와 기본 명령어까지

Redis는 뛰어난 속도와 유연성 덕분에 개발자에게 매우 강력한 도구가 되며, 다양한 방식으로 활용할 수 있습니다. 흔히 키-값 저장소(key-value store)로 불리지만, 사실 Redis는 5가지 데이터 구조 타입을 지원하기 때문에 데이터 구조 서버(Data Structure Server)라고 표현하는 것이 더 정확합니다.

  • Strings (문자열)
  • Hashes (해시)
  • Lists (리스트)
  • Sets (집합)
  • Sorted Sets (정렬된 집합)

각 구조 타입은 공통으로 사용할 수 있는 명령어와 함께 해당 구조에 특화된 고유 명령어들도 제공합니다.

이 글에서는 Redis 사용법의 기초와 다양한 데이터 구조에 대한 개요를 다룹니다. 기본적인 명령어 몇 가지를 살펴보겠습니다. 참고로 이 글을 작성하는 시점 기준 Redis에는 160개 이상의 명령어가 있으며, 자세한 내용은 redis.io/commands에서 훌륭한 공식 문서를 확인할 수 있습니다.

Redis 시작하기

ObjectRocket에서 제공하는 Redis 인스턴스를 사용하거나, 로컬 환경에 직접 Redis를 설치할 수 있습니다.

로컬에 설치하려면 소스 코드를 내려받아 압축을 풀고 컴파일하면 됩니다:

$ wget https://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make

그다음 로컬 인스턴스를 실행합니다:

$ src/redis-server

Redis 접속하기

이제 내장 클라이언트를 통해 Redis와 상호작용할 준비가 되었습니다. ObjectRocket의 Redis 인스턴스를 사용한다면 호스트명, 포트, 비밀번호와 함께 redis-cli를 실행하세요:

$ redis-cli -h my-host -p 1234 -a mypassword

로컬 인스턴스를 사용하는 경우라면 호스트는 localhost, 기본 포트는 6379이며, 기본적으로 비밀번호는 설정되어 있지 않습니다.

$ redis-cli

GET과 SET

가장 단순한 수준에서 Redis는 키-값 저장소라고 할 수 있습니다. SET foo bar 명령을 실행하면 foo 키의 값이 bar로 설정됩니다. 방금 실행한 redis-cli에서 다음 명령을 입력해 보세요:

redis> SET foo bar
OK

이번에는 GET 명령으로 foo의 값을 읽어 보겠습니다.

redis> GET foo
"bar"

EXPIRE와 TTL

EXPIRE 명령을 사용하면 특정 시간이 지난 후 키가 만료되도록 설정할 수 있습니다. TTL은 키가 만료되기까지 남은 시간을 알려줍니다.

redis> SET foo bar
OK
redis> EXPIRE foo 120
(integer) 1
redis> TTL foo
(integer) 113

리스트(Lists)

Redis의 두드러진 특징 중 하나는 키의 값이 단순한 값이 아니라 데이터 구조 자체가 될 수 있다는 점입니다.

리스트를 생성하려면 LPUSH 또는 RPUSH를 사용합니다. 리스트가 이미 존재하는 경우 LPUSH는 값을 리스트의 맨 앞에 추가하고, RPUSH는 맨 뒤에 추가합니다.

redis> LPUSH cities "San Francisco"
(integer) 1
redis> RPUSH cities "Austin"
(integer) 2
redis> LRANGE cities 0 -1
1. "San Francisco"
2. "Austin"
redis> SORT cities alpha
1. "Austin"
2. "San Francisco"
redis> LPOP cities
"San Francisco"
redis> LRANGE cities 0 -1
1. "Austin"

SORT 명령은 ALPHA 인자와 함께 사용하면 리스트를 사전순 오름차순으로 정렬합니다. 내림차순으로 정렬하려면 SORT 명령에 DESC 인자를 추가하면 됩니다.

RPOP 명령은 리스트의 끝에서 요소를 꺼내고, LPOP은 리스트의 맨 앞에서 요소를 꺼냅니다.

셋(Sets)

셋은 리스트와 비슷하지만, 각 요소가 한 번만 존재할 수 있다는 점이 다릅니다. 아래 예제에서는 미국 주(state)로 구성된 작은 셋을 만들어 보겠습니다. SADD 명령은 해당 요소가 셋에 이미 존재하지 않는 경우에만 요소를 추가합니다. 요소가 존재하지 않으면 추가된 후 1을 반환하고, 이미 존재하면 0을 반환합니다. SMEMBERS는 셋의 모든 요소를 반환하고, SCARD는 셋의 요소 개수를 반환합니다. SREM은 셋에서 요소를 제거합니다.

redis> SADD states "Vermont"
(integer) 1
redis> SMEMBERS states
1. "Vermont"
redis> SADD states "Texas"
(integer) 1
redis> SCARD states
(integer) 2
redis> SADD states "Vermont"
(integer) 0
redis> SMEMBERS states
1. "Vermont"
2. "Texas"
redis> SADD states "California"
(integer) 1
redis> SMEMBERS states
1. "Vermont"
2. "Texas"
3. "California"
redis> SREM states "California"
(integer) 1
redis> SMEMBERS states
1. "Vermont"
2. "Texas"

해시(Hashes)

해시를 사용하면 각 키 안의 필드에 문자열 값을 할당하고 매핑할 수 있습니다. 필드가 몇 개뿐인 해시는 매우 적은 공간으로 저장되기 때문에 작은 Redis 인스턴스 하나에 수백만 개의 객체를 저장할 수도 있습니다. 아래 예제에서는 HSET 명령으로 user:1의 name 필드를 "john racker"로 설정합니다. HGET 명령은 user의 name 값을 조회하는 데 사용되며, HGETALL은 지정된 키와 관련된 모든 키와 값을 반환합니다.

redis> HSET user:1 name "john racker"
(integer) 1
redis> HGET user:1 name
"joe racker"
redis> HSET user:1 company "objectrocket"
(integer) 1
redis> HGET user:1 company
"ObjectRocket"
redis> HSET user:1 city "austin"
(integer) 1
redis> HGET user:1 city
"austin"
redis> HGETALL user:1
1. "name"
2. "john racker"
3. "company"
4. "objectrocket"
5. "city"
6. "austin"

정렬된 집합(Sorted Sets)

정렬된 집합(Sorted Set)은 문자열의 중복 없는 컬렉션이라는 점에서 일반 셋과 비슷하지만, 모든 멤버가 점수(score)와 연결되어 있다는 차이가 있습니다. 정렬된 집합은 점수를 기준으로 오름차순 정렬됩니다. 동일한 요소는 한 번만 존재할 수 있고 중복 요소는 허용되지 않지만, 점수 자체는 중복될 수 있습니다.

이번 예제에서는 2014년 10월 23일 기준 잉글랜드 프리미어리그 상위 5개 팀의 승점을 추가해 보겠습니다:

redis> ZADD EPL 22 "chelsea"
(integer) 1
redis> ZADD EPL 17 "man city"
(integer) 1
redis> ZADD EPL 16 "southampton"
(integer) 1
redis> ZADD EPL 13 "liverpool"
(integer) 1
redis> ZADD EPL 13 "west ham"
(integer) 1
redis> ZRANK EPL "chelsea"
(integer) 3
redis> ZRANK EPL "liverpool"
(integer) 0
redis> ZRANK EPL "arsenal"
(nil)

다음으로 ZRANGE를 사용해 승점을 기준으로 팀들의 순위를 확인해 보겠습니다:

redis> ZRANGE EPL 0 -1
1) "liverpool"
2) "west ham"
3) "southampton"
4) "man city"
5) "chelsea"
redis> ZRANGE EPL 2 3
1) "southampton"
2) "man city"

집합은 오름차순으로 정렬된다는 점을 기억하세요. 따라서 승점 기준 순위를 보려면 ZREVRANGE를 사용해야 합니다.

redis> ZREVRANGE EPL 0 -1
1) "chelsea"
2) "man city"
3) "southampton"
4) "west ham"
5) "liverpool"
redis> ZREVRANGE EPL 0 -1 WITHSCORES
1) "chelsea"
2) "22"
3) "man city"
4) "17"
5) "southampton"
6) "16"
7) "west ham"
8) "13"
9) "liverpool"
10) "13"

이번에는 사우샘프턴이 경기에서 승리하여 3점을 얻었다고 가정해 보겠습니다. ZINCRBY로 점수를 증가시키고, ZREVRANGE로 사우샘프턴이 리그 2위로 올라선 것을 확인할 수 있습니다. ZREVRANK로도 사우샘프턴의 순위를 확인할 수 있습니다. 참고로 순위는 0부터 시작하므로, 가장 높은 점수를 가진 첼시의 순위는 0입니다.

redis> ZINCRBY EPL 3 "southampton"
"19"
redis> ZREVRANGE EPL 0 -1 WITHSCORES
1) "chelsea"
2) "22"
3) "southampton"
4) "19"
5) "man city"
6) "17"
7) "west ham"
8) "13"
9) "liverpool"
10) "13"
redis> ZREVRANK EPL "southampton"
(integer) 1
redis> ZREVRANGEBYSCORE EPL 25 (15
1) "chelsea"
2) "southampton"
3) "man city"

앞으로 몇 주에 걸쳐 Redis와 이 놀랍도록 다재다능한 개발자 도구의 다양한 활용 사례를 더 깊이 살펴볼 예정입니다. Redis 운영에 관한 질문이 있거나, 애플리케이션 스택에서 Redis를 어떻게 활용하고 계신지 알려주시면 기꺼이 들려주세요.