티스토리 뷰


Redis 데이터 타입에 대한 글은 인터넷에 널리고 널렸다. 당장 그 이론을 한번 더 언급하는 것은 괜한 비용 낭비로 생각되니 실전 운영에 필요한 기초 예제 몇 가지를 공유해본다. 이번 글에서는 ListHash 에 대해 집중적으로 다룬다.

List

리스트 형태로 데이터를 관리할 때 용이하게 사용되는 데이터 타입이다. 데이터는 LPUSH, RPUSH 로 적재하고 LPOP, RPOP 으로 꺼낼 수 있다. 한편 조회는 LRANGE, LLEN 을 사용한다. 아래에서 데이터를 확인하며 구체적으로 알아보자.

이러한 리스트가 있을 때 LPUSH, LPOP 은 배열의 좌측에 있는 데이터를 제어할 수 있다. 즉, LPUSH 로 새로운 데이터 8을 넣게 되면 아래와 같이 데이터가 들어간다.

redis> LPUSH keyname 8

이때 LPOP 도 마찬가지로 좌측에 있는 데이터 8을 꺼내오는데 사용된다. 예상할 수 있겠지만 LPUSH, LPOPLLeft 를 나타낸다. 반대로 RPUSH, RPOP 은 우측에 데이터를 적재하고 꺼내오는데 사용된다. LPOP 을 이용해서 8을 빼내고 다시 RPUSH 를 통해 8을 삽입하면 결과적으로 리스트는 아래 그림과 같은 형식이 된다.

redis> RPUSH keyname 8

LPUSH, LPOP, RPUSH, RPOP 이를 조합해서 사용하면 리스트를 큐(FIFO)와 스택(LIFO) 형태로 자유롭게 사용할 수 있겠다.


키의 길이 조회 - 아래처럼 리스트 안에 몇 개의 아이템이 있는지 조회할 때 사용할 수 있다.

127.0.0.1:6379> LLEN keyname
(integer) 8
127.0.0.1:6379>

전체 List 출력 - 리스트에 있는 전체 데이터를 출력할 때 사용된다. 출력할 데이터의 범위를 처음(0)부터 끝(-1)까지 지정했다고 생각하면 된다. 일반적인 프로그래밍에서 자주 찾아볼 수 있는 범위지정 방법이다.

127.0.0.1:6379> LRANGE keyname 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
127.0.0.1:6379>


Hash

데이터를 HASH 형태로 다룰 때 사용된다. 이때 사용되는 용어는 key, field, value 가 있는데 keyHASH 를 구분할 수 있는 이름으로 생각하면 되고 fieldRDBMS 에 테이블 칼럼을 생각하면 된다. value 는 각 칼럼의 값이 되겠다. 아래와 같이 데이터를 넣고 구조를 살펴보자. (KEY 는 대소문자를 구분한다)

127.0.0.1:6379> HMSET Caley JOB "PROGRAMMER" AGE 20
OK
127.0.0.1:6379>

데이터는 아래와 같은 형식으로 Caley 라는 KEY 에 생성된다.

redis> HMSET Caley JOB "PROGRAMMER" AGE 20

정말 그런지는 Caley 키의 전체 내용을 아래와 같이 조회해보면 알 수 있다

127.0.0.1:6379> HGETALL Caley
1) "JOB"
2) "PROGRAMMER"
3) "AGE"
4) "20"
127.0.0.1:6379>

Caley 에 있는 모든 KEY 를 아래와 같이 HKEYS 를 이용해서 뽑아볼 수도 있다. (모든 값은 HVALS 를 이용)

127.0.0.1:6379> HKEYS Caley
1) "JOB"
2) "AGE"
127.0.0.1:6379>

데이터를 관리하는 입장에서 보니 성별 필드가 없어서 사용자를 구분하는게 쉽지 않다는 판단이 들어 아래와 같이 성별 필드를 추가하게 된다.

127.0.0.1:6379> HSET Caley SEX male
(integer) 1
127.0.0.1:6379>

이제 데이터를 살펴보면 SEX 필드가 추가된 것을 확인할 수 있다.

127.0.0.1:6379> HGETALL Caley
1) "JOB"
2) "PROGRAMMER"
3) "AGE"
4) "20"
5) "SEX"
6) "male"
127.0.0.1:6379>

한편 필드를 삭제할 때는 HDEL 을 이용하면 되겠다. AGE 는 아래와 같이 삭제될 수 있다.

127.0.0.1:6379> HDEL Caley AGE
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> HGETALL Caley
1) "JOB"
2) "PROGRAMMER"
3) "SEX"
4) "male"
127.0.0.1:6379>


Etc

보너스 같은 개념으로 터미널에서 파이프(|)를 통해 Redis 명령어를 폭 넓게 사용해보자.

터미널에서 Redis stdin 으로 쿼리 입력

$ echo "keys *" | redis-cli


모든 Sorted sets 에서 특정 field 조회

$ echo "ZRANGE keyname 0 -1" | redis-cli


Redis 전체 설정 보기

127.0.0.1:6379> info all


위에 상태에서 DB 별 사용현황은 keyspace 를 통해 확인할 수 있는데 각 dbkeys 의 개수를 참고하면 되겠다.

# Keyspace
db0:keys=8,expires=0,avg_ttl=0


Redis 상태 확인

$ redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys       mem      clients blocked requests            connections
8          990.75K  1       0       103 (+0)            5
8          990.75K  1       0       104 (+1)            5
8          990.75K  1       0       105 (+1)            5
8          990.75K  1       0       106 (+1)            5
8          990.75K  1       0       107 (+1)            5


현재 redis 에서 일어나는 모든 명령어 확인

$ redis-cli monitor
OK
1519605789.426160 [0 127.0.0.1:64162] "COMMAND"
1519605796.388919 [0 127.0.0.1:64162] "zrange" "myzset" "0" "-1" "WITHSCORES"
1519605801.609068 [0 127.0.0.1:64162] "zadd" "myzset" "1" "one"


조금 복잡한 아티텍처로 갈수록 listhash, sorted sets 의 비중이 많이 늘어난다. 이 세가지를 유연하게 사용할 수 있는 것이 곧 운영의 핵심이겠다. 잘 숙지하도록 하자 (sorted sets 에 대해서는 별도의 포스팅에서 다루도록 한다). 더 다양한 사용법과 명령어에 대한 부분은 아래 링크에서 확인할 수 있다.

https://redis.io/commands

댓글
댓글쓰기 폼