티스토리 뷰
Redis 데이터 타입에 대한 글은 인터넷에 널리고 널렸다. 당장 그 이론을 한번 더 언급하는 것은 괜한 비용 낭비로 생각되니 실전 운영에 필요한 기초 예제 몇 가지를 공유해본다. 이번 글에서는 List 와 Hash 에 대해 집중적으로 다룬다.
List
리스트 형태로 데이터를 관리할 때 용이하게 사용되는 데이터 타입이다. 데이터는 LPUSH, RPUSH 로 적재하고 LPOP, RPOP 으로 꺼낼 수 있다. 한편 조회는 LRANGE, LLEN 을 사용한다. 아래에서 데이터를 확인하며 구체적으로 알아보자.
이러한 리스트가 있을 때 LPUSH, LPOP 은 배열의 좌측에 있는 데이터를 제어할 수 있다. 즉, LPUSH 로 새로운 데이터 8을 넣게 되면 아래와 같이 데이터가 들어간다.
redis> LPUSH keyname 8
이때 LPOP 도 마찬가지로 좌측에 있는 데이터 8을 꺼내오는데 사용된다. 예상할 수 있겠지만 LPUSH, LPOP 의 L 은 Left 를 나타낸다. 반대로 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 가 있는데 key 는 HASH 를 구분할 수 있는 이름으로 생각하면 되고 field 는 RDBMS 에 테이블 칼럼을 생각하면 된다. 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 를 통해 확인할 수 있는데 각 db 별 keys 의 개수를 참고하면 되겠다.
# 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"
조금 복잡한 아티텍처로 갈수록 list 와 hash, sorted sets 의 비중이 많이 늘어난다. 이 세가지를 유연하게 사용할 수 있는 것이 곧 운영의 핵심이겠다. 잘 숙지하도록 하자 (sorted sets 에 대해서는 별도의 포스팅에서 다루도록 한다). 더 다양한 사용법과 명령어에 대한 부분은 아래 링크에서 확인할 수 있다.
'개발 > DB' 카테고리의 다른 글
[MySQL] 터미널에서 쿼리 전체 보기 (0) | 2019.08.14 |
---|---|
[MySQL] WorkBench 쿼리 타임아웃 (3) | 2018.08.20 |
[mysql] command-line에서 자동완성 사용 (0) | 2016.05.30 |
[mysql] update 문법 (0) | 2015.12.04 |
[mysql] 컬럼 타입 INT 괄호 옵션 (1) | 2015.12.01 |
- Total
- Today
- Yesterday