소개

Redis는 Remote Dictionary System의 약자로, C로 개발된 오픈 소스 Key-Value Store이다. Redis는 종종 데이터 구조 서버(data structures server)라고 불리는데, 이는 Redis가 일련의 명령어들을 통해 가변적인 데이터 구조에 접근할 수 있는 환경을 제공하기 때문이다. Redis에서 데이터는 TCP 소켓과 간단한 프로토콜을사용하는 Server-Client 모델을 통해 전송된다.

Redis의 데이터 구조는 다음과 같은 특징을 가진다.

  • 모든 데이터는 Memory에서 수정되고 제공되지만, Redis의 이 데이터들을 Disk에 저장한다. 이것은 Redis가 빠른 속도를 제공할 뿐만 아니라, 데이터의 비휘발성 역시 보장한다는 뜻이다.
  • 다른 고수준의 프로그래밍 언어에서 개발된 같은 데이터 구조에 비해 메모리를 덜 사용한다.
  • Redis는 데이터베이스에서 흔히 찾을 수 있는 복제(replication), 조정 가능한 수준의 내구성(tunable levels of durability), 클러스터(cluster), 높은 안정성(high availability)과 같은 특징들 역시 제공한다.

Redis를 이해할 수 있는 쉬운 예는, 이를 더 복잡한(그리고 발전된) 버전의 memcached라고 생각하는 것이다. SET, GET과 같은 명령어 외에도, Redis는 Lists, Sets, 그리고 Sorted Sets 등의 복잡한 데이터 형과 관련된 연산들 역시 제공한다.

데이터 타입

Redis는 단순한 키-값 저장소(key-value store)가 아닌, 여러 종류의 값을 지원하는 데이터 구조 서버(data structures server)이다. 다른 전통적인 Key-Value Store는 string 키와 값만을 제공하지만, Redis에서는 string 외에도 다른 복잡한 데이터 구조를 값으로 사용할 수 있다.

1. Strings

Redis String은 가장 간단한 타입의 값이며, binary-safe하다. 이는 받는 모든 데이터를 text가 아닌 binary로 받는다는 것이고, 따라서 “foo”와 같은 string부터 JPEG파일까지 모든 2진 데이터를 사용할 수 있다.
Redis의 Key 역시 String 타입이다. 한 가지 재미있는 점은, 빈 문자열 역시 키로 사용될 수 있다는 것이다. 하지만 너무 짧거나 긴 키는 좋지 않은 생각이다. 키는 “comment:1234:reply-to”와 같이 스키마와 대시(-), 점(.)을 사용하여 만드는 것이 좋다. 키가 너무 길어진다면 해싱하는 것도 좋다. 키의 최대값은 512 MB이다.
String의 명령어로는 SET, GET, DEL, INCR, INCRBY, DECR, DECRBY, EXISTS 등이 있다.

2. Lists

리스트는 어떤 방법으로 구현되었는지에 따라 그 특징과 쓰임새가 달라지는데, Redis의 List는 Linked List의 일종이다. 따라서 새 요소를 리스트의 head나 tail에 추가하는데 걸리는 시간이 리스트의 크기와 관계없이 일정하다. 하지만 인덱스를 통해 각각의 요소에 접근하는데 걸리는 시간은 Array에 비해 그렇게 빠르지 않다. Redis List의 경우, 데이터베이스 시스템은 매우 긴 리스트에 최대한 빨리 새 요소를 추가하는 것이 중요하므로 Linked List를 사용했다. 다른 장점은 상수 시간 내에 길이를 알아내는 것이 가능하다는 것이다. 그러나 인덱스를 통해 데이터에 빠르게 접근하는게 중요할 수도 있기 때문에, Redis는 Sorted set 역시 제공한다.
List의 명령어로는 LPUSH, RPUSH, LPOP, RPOP, LRANGE, RRANGE이, LTRIM, RTRIM 등이 있다.

3. Hashes

Redis Hash는 Key-Value Table이다. Java의 Hashtable이나 C#의 Dictionary를 생각하면 쉽다. 간단한 예제를 통해 사용법을 알아보자.
Hash의 명령어로는 HMSET, HGET, HGETALL, HMGET, HINCRBY 등이 있다.

1
2
3
4
5
6
> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"

4. Sets

Redis Set은 정렬되지 않은(unordered) 문자열의 집합이다. 집합이기 때문에 중복되는 요소는 하나로 처리한다. Set은 객체 간 관계를 표현하기 좋다. 간단한 예로, 우리는 Set을 이용해 태그를 달 수 있다.
Set의 명령어로는 SADD, SMEMBERS, SISMEMBER, SPOP 등이 있다.

5. Sorted Sets

Redis Sorted Set은 Set과 Hash를 섞어 놓은 것과 비슷하다. Sorted Set은 Set과 같이 중복되지 않는 String Element로 구성되어 있지만, score라는 실수값에 의해 오름차순으로 정렬된다는 특징을 가진다. 정렬이 되어 있기 때문에 range나 rank에 따른 query가 가능하다.
Sorted Set의 명령어로는 ZADD, ZRANGE, ZREVRANGE, ZRANGEBYSCORE, ZRANK 등이 있다.

설치

다음은 Redis 공식 홈페이지의 Download 페이지에서 제공하는 가이드이다.

1
2
3
4
$ wget http://download.redis.io/releases/redis-3.0.2.tar.gz
$ tar xzf redis-3.0.2.tar.gz
$ cd redis-3.0.2
$ make

이대로 해서 별 문제가 없다면 다행이지만, 내 경우 리눅스를 설치하고 나서 따로 해둔게 없었기 때문에 Redis 설치 과정에서 해야 할 것이 몇가지 더 있었다. 발생한 문제는 세 가지였는데, 마지막 내용은

1
2
3
4
5
6
7
cd src && make all
make[1]: Entering directory `/home/ubuntu/redis-3.0.2/src’
CC adlist.o
/bin/sh: 1: cc: not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/home/ubuntu/redis-3.0.2/src’
make: *** [all] Error 2

이 오류의 해결책이다. redis-3.0.2 폴더 내에서 명령어를 입력해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
make가 없는 경우
$ sudo apt-get install make
$ make

gcc가 없는 경우
$ sudo apt-get update
$ sudo apt-get install make
$ sudo apt-get install gcc
$ make

그 외
$ cd deps
$ make hiredis lua jemalloc line noise
$ cd ..
$ make

설치 후 set, get, del 명령어를 사용하여 간단하게 테스트를 해봤다.

1
2
3
4
5
6
7
8
9
10
$ src/redis-server &
$ src/redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> del foo
(integer) 1
127.0.0.1:6379> get foo
(nil)

PATH 설정을 해 두면 더 편하게 사용할 수 있다. redis-3.0.2 폴더의 상위 폴더에서 아래 명령어를 입력한다. /etc/enviroment의 PATH 끝에 :/usr/lib/redis-3.0.2/src를 추가해주자. 참고로 이는 우분투 기준이며, Mac OS X나 CentOS에서는 홈 폴더의 .profile 혹은 .bash_profile을 수정해주면 된다.

1
2
3
$ sudo mv redis-3.0.2 /usr/lib
$ sudo vi /etc/enviroment
$ source /etc/enviroment

참고

Redis 공식 홈페이지
Redis GitHub
조대협의 블로그