Redis

Redis는 Remote Dictionary Server의 약자로써 메모리를 이용한 Database라고 할 수 있습니다.
In-Memory Data Store 즉, 메모리를 이용한 데이터 저장 프로그램입니다.
MemCached와 같이 Key-value 는 물론, Lists, Sets, Hashs 등의 여러 자료형을 지원하고 있습니다.

Redis 설치 방법

Debian 계열 리눅스를 예로 설명하겠습니다.

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar -zxvf redis-stable.tar.gz
$ cd redis-stable
$ make install

Redis 설정

Redis를 컴파일하면 src 디렉토리에 redis-cli redis-server등의 바이너리가 생성되는데,
redis-server를 통해 서버를 실행하게 되면 정말 포그라운드에서 실행되기 때문에 백그라운드 서비스로 이용하기 위해 옵션을 필요로 합니다.
우선 설정 파일을 /etc/redis.conf로 설정하여 서비스를 설정 및 실행하도록 하겠습니다.

$ sudo cp redis.conf /etc/redis.conf

Redis에 비밀번호를 설정하기 위해 /etc/redis.conf파일을 수정합니다.
파일에 requirepass라는 부분에 주석이 되어있지만 해제 한 후 원하는 비밀번호로 설정해줍니다.

Redis 비밀번호 설정

/etc/redis.conf

....
# use a very strong password otherwise it will be very easy to break.
#
requirepass 비밀번호

# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
....

빌드 된 바이너리 들을 /usr/local/bin/에 옮겨줍니다.

$ cp src/redis-benchmark src/redis-server src/redis-sentinel src/redis-cli /usr/local/bin

Redis를 백그라운드로 실행시키기 위한 서비스 등록

/etc/systemd/system/redis.service

[Unit]
Description=Redis

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

Redis 서비스 전용 사용자 생성

$ sudo adduser --system --group --no-create-home redis

Redis 실행 및 상태 확인

$ sudo service start redis
$ sudo service status redis
● redis.service - Redis
   Loaded: loaded (/etc/systemd/system/redis.service; static; vendor preset: enabled)
   Active: active (running) since 토 2018-04-28 23:05:33 KST; 1min 4s ago
 Main PID: 23569 (redis-server)
   CGroup: /system.slice/redis.service
           └─23569 /usr/local/bin/redis-server 127.0.0.1:6379

 4월 28 23:05:33 imustdowork redis-server[23569]:  |    `-._`-._        _.-'_.-'    |
 4월 28 23:05:33 imustdowork redis-server[23569]:   `-._    `-._`-.__.-'_.-'    _.-'
 4월 28 23:05:33 imustdowork redis-server[23569]:       `-._    `-.__.-'    _.-'
 4월 28 23:05:33 imustdowork redis-server[23569]:           `-._        _.-'
 4월 28 23:05:33 imustdowork redis-server[23569]:               `-.__.-'
 4월 28 23:05:33 imustdowork redis-server[23569]: 23569:M 28 Apr 23:05:33.216 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
 4월 28 23:05:33 imustdowork redis-server[23569]: 23569:M 28 Apr 23:05:33.216 # Server initialized
 4월 28 23:05:33 imustdowork redis-server[23569]: 23569:M 28 Apr 23:05:33.216 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memo
 4월 28 23:05:33 imustdowork redis-server[23569]: 23569:M 28 Apr 23:05:33.216 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with R
 4월 28 23:05:33 imustdowork redis-server[23569]: 23569:M 28 Apr 23:05:33.216 * Ready to accept connections

Redis 연결

$ redis-cli
127.0.0.1:6379> auth 비밀번호
OK
127.0.0.1:6379> ping
PONG

Redis의 자료형

Redis는 String, List, Hash, Set, HyperLogLogs등의 자료형이 존재합니다. 본 글에서는 String, List, Hash 자료형에 대해서만 알아보도록 하겠습니다.

String 자료형

개인적으로 제일 많이 사용하고 있는 자료형 중의 하나로, Key에 대한 문자열을 저장할 수 있는 타입입니다.

127.0.0.1:6379> set hello "Hello World!"
OK
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists hello2
(integer) 0
127.0.0.1:6379> get hello
"Hello World!"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> setex expirekey 60 data
OK
127.0.0.1:6379> ttl expirekey
(integer) 56
127.0.0.1:6379> get expirekey
"data"
127.0.0.1:6379> set counter 1
OK
127.0.0.1:6379> get counter
"1"
127.0.0.1:6379> incr counter
(integer) 2
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incrby counter 10
(integer) 12
127.0.0.1:6379> mset hello "world" world "hello"
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> get world
"hello"
127.0.0.1:6379> mget hello world
1) "world"
2) "hello"

List 자료형

List 자료형은 String 데이터를 배열과 같은 형태로 가지고 있는 자료형입니다.

127.0.0.1:6379> rpush number 0
(integer) 1
127.0.0.1:6379> rpush number 1
(integer) 2
127.0.0.1:6379> lrange number 0 -1
1) "0"
2) "1"
127.0.0.1:6379> lpush number 2
(integer) 3
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "0"
3) "1"
127.0.0.1:6379> rpush number 3 4
(integer) 5
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "0"
3) "1"
4) "3"
5) "4"
127.0.0.1:6379> rpop number
"4"
127.0.0.1:6379> lrange number 0 -1
1) "2"
2) "0"
3) "1"
4) "3"
127.0.0.1:6379> lpop number
"2"
127.0.0.1:6379> lrange number 0 -1
1) "0"
2) "1"
3) "3"
127.0.0.1:6379> ltrim number 0 1
OK
127.0.0.1:6379> lrange number 0 -1
1) "0"
2) "1"

Hash 자료형

Hash 자료형은 Field와 Value 쌍으로 이루어진 데이터를 저장할 수 있는 타입입니다.

127.0.0.1:6379> hmset user username admin email antiweb@noe.systems
OK
127.0.0.1:6379> hget user email
"antiweb@noe.systems"
127.0.0.1:6379> hgetall user
1) "username"
2) "admin"
3) "email"
4) "antiweb@noe.systems"

Redis를 이용해서 Session Store로 사용하기도 하고,
기능을 구현할 때 있어서 많이 사용될 수 있는 In Memory Store라고 생각합니다.

태그Redis