Redis

개요

레디스는 Remote Dictionary Server의 약자로서, “키-값” 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템이다. 2009년 살바토르 산필리포가 처음 개발했다. 2015년부터 Redis Labs가 지원하고 있다. 다양한 서비스에서 레디스를 자유롭게 사용되고 있다.

Pareto principle(파레토의 법칙)

우리 사회에서 일어나는 현상의 80%는 20%의 원인으로 인해 발생됨을 뜻하는 법칙이다. 웹 사이트에 대한 접근도 파레토의 법칙이 딱 들어맞아,

인터넷 통신의 80%가 불과 20%의 사이트에 대한 액세스로 추정되며, 이 20%의 웹사이트 데이터를 캐시해두면 효율을 극적으로 향상할 수 있다

고 합니다.

(인프라 엔지니어의 교과서 - 네트워크편, 2017, 길벗)

따라서 공통으로 사용되는 데이터는 레디스를 이용하여 캐시로 저장해 두는 것이 리소스를 효율적으로 이용할 수 있는 방법이 될 수 있을 것이다.

왜 Collection이 중요한가요?

레디스는 In-Memory 데이터베이스이다. 즉, 모든 데이터를 메모리에 저장하고 조회한다. 기존 관계형 데이터베이스(Oracle, MySQL) 보다 훨씬 빠른데 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다. 하지만 빠르다는 것은 레디스의 여러 특징 중 일부분이다. 다른 In-Memory 데이터베이스(ex. Memcached) 와의 가장 큰 차이점은 다양한 자료구조 를 지원한다는 것이다. 레디스는 아래처럼 다양한 자료구조를 Key-Value 형태로 저장한다.

레디스는 기본적으로 String, Bitmap, Hash, List, Set, Sorted Set 를 제공했고, 버전이 올라가면서 현재는 Geospatial Index, Hyperloglog, Stream 등의 자료형도 지원하고 있다.

그렇다면 이렇게 다양한 자료구조를 제공하는게 왜 중요할까요? 바로 개발의 편의성과 난이도 때문이다.

예를 들어, 실시간 랭킹 서버를 구현할 때 관계형 DBMS를 이용한다면 DB에 데이터를 저장하고, 저장된 SCORE 값으로 정렬하여 다시 읽어오는 과정이 필요할 것이다. 개수가 많아지면 속도가 느려지게 마련인데, 이 과정에서 디스크를 사용하기 때문이다. In-memory 기반으로 서버에서 데이터를 처리하도록 직접 코드를 짤 수도 있겠지만, 레디스의 Sorted-Set을 이용하는게 더 빠르고 간단한 방법일 것이다.

Redis 특징

  • Redis는 key-value store NoSQL DB이다.
  • 싱글 스레드로 동작하며, 자료 구조를 지원한다.
  • 다양한 용도로 사용될 수 있도록 다양한 기능을 지원한다.
  • 데이터의 스냅샵 혹은 AOF 로그를 통해 복구가 가능해서 어느정도는 영속성도 보장된다.
  • Java Spring에서는 세션 관리 및 캐싱을 하는데 자주 사용된다.

서버 제어

시작

$ redis-cli

서버 정보 조회

> info
# Server
redis_version:6.0.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:ffd199d8341c2d8f
redis_mode:standalone
... 이하 생략 ....

연결된 클라이언트 목록 조회

> client list

연결된 클라이언트 연결을 끊기

> client kill 10.0.0.8:33333

명령 실행 후에 받은 요청을 모두 덤프

> monitor
OK

Key 조작

key, value 설정

set {key명} {value}
> set key01 value01
OK

key로 value 조회

get {key명}
> get key01
value01

key 목록 조회

> keys *
key01

key 삭제

> del key01
1

key가 존재하는지 확인 (1이라면 참)

exists {key명} {value}
> exists key01
0

키가 이미 존재하지 않으면 데이터를 세트

setnx {key명} {value}
> setnx key01 value02
1
> setnx key01 value02
0

결과가 0이면 키가 존재하기 때문에 데이터가 업데이트되지 않았다는 것을 의미한다

기존 key명 변경

rename {이전 key명} {새로운 key명}
> rename key01 key02 
OK
> rename key03 key04
ERR no such key

현재 데이터베이스의 키 개수를 반환

> dbsize
2

특정 key를 다른 데이터베이스로 이동

> move key01 1
1

DB 번호 선택

> select 1
OK

현재 데이터베이스의 키를 모두 삭제하기

> flushdb
OK

모든 데이터베이스의 키를 모두 삭제하기

> flushall
OK

정규식

Redis에서 사용할 정규 표현식은 다음 만

  • [] : 괄호 안의 문자 중 하나 하나
  • * : 임의의 문자열
  • ? : 단일 문자

사용 예

# 모든 Key 목록을 조회한다.
$ keys *

# 숫자로 시작하는 키를 조회한다.
$ keys [0-9]*

Multiple Key

여러 key 값을 모와서 설정

> mset key01 value01 key02 value02 key03 value03 
OK

여러 key 값을 한번에 조회

> mget key01 key02 key03
value01
value02
value03

expire

유효 기간을 설정하여 키를 설정

아래 예제는 60초로 설정하였다.

> setex key01 60 value01 
OK

기존의 키 만료 설정

> expire key02 30

Math

key 값에 1 더하기

아래 예제에서는 key02에 1을 설정하고 1을 증가 시킨다.

> set key02 1 
OK
> incr key02 
2

key 값에 지정된 수를 더하기

> incrby key02 100 
102

key 값에 1 빼기

> decr key02 
101

key 값에 지정된 수를 빼기

> decrby key02 51 
50

List

List의 맨 위에 값을 추가

공백으로 구분하여 여러 값을 지정 가능하다.

> lpush list01 value01
1

List의 끝에 값을 추가

공백으로 구분하여 여러 값을 지정 가능하다.

> rpush list01 value02
2

List 요소의 수를 반환

> llen list01
2

List에서 지정 번호의 요소를 반환

> lindex list01 0
value01

List에서 지정한 시작 번호부터 끝 번호까지의 요소를 반환

> lrange list01 0 1
value01
value02

List의 지정 번호의 요소를 지정된 값으로 변경

> lset list01 1 value03
OK
> lindex list01 1
value03

List의 첫 번째 요소를 반환하고 삭제

> lpop list01
value01

List의 마지막 요소를 반환하고 삭제

> rpop list01
value03

List에서 지정한 시작 번호부터 끝 번호까지의 요소에 잘라낸 형태로 그 목록을 변경

> ltrim list01 1 3
OK

Hash

부모 Key (key) 자식 Key (field) 값 (value)에 의해 관리되는 데이터 형식이다. 예를 들어, 부모 Key를 제품 ID 하위 키를 제품 속성 정보를 저장하는 방식으로 사용하면 RDB의 데이터 관리에 가까운 사고 방식에서 사용할 수 있다.

Hash 지정 필드에 값을 추가

> hset hash01 field01 value01
(integer) 1

Hash 지정 필드의 값을 반환

> hget hash01 field01
"value01"

Hash의 여러 필드에 추가

> hmset hash01 field02 value02 field03 value03
OK

해시의 여러 필드의 값을 반환

> hmget hash01 field01 field02 field03
value01
value02
value03

Hash 필드를 모두 반환

> hkeys hash01
field01
field02
field03

Hash 필드의 값을 모두 반환

> hvals hash01
value01
value02
value03

Hash 지정 필드의 값을 지정 수 플러스

> hincrby hash01 field04 100
101

Hash 지정 필드가 존재하는지 확인

> hexists hash01 field01
1

Hash 필드 수를 반환

> hlen hash01
4

Hash 지정 필드를 제거하려면

> hdel hash01 field04
1

그밖에 조작

keys를 사용하지 못할때 key 검색하는 방법

scan 0 match devkuma-* count 1000

key 이름은 wildcard 검색할 수 있고, devkuma-*devkuma-로 시작하는 키를 검색한다.

참조