본문 바로가기

Programming/Database

Redis의 자료구조

반응형

안녕하세요. 남산돈가스입니다.

2020/07/16 - [Programming/Database] - Redis 개념 및 설치

지난 포스팅에 이어서 이번에는 Redis에서 제공되는 다양한 자료구조에 대해서 알아보려고 합니다.

지난번에 설명한 대로 Redis는 다양한 자료구조를 제공하고 있기 때문에 개발에 있어 비즈니스 로직에 더욱 집중할 수 있도록 합니다.

s

다시 가져온 그림입니다. 위 자료구조 중에서 대표적으로 쓰이는 것들을 위주로 설명드리겠습니다.

String

우리가 알고 있는 key-value에서 가장 기본적인 형태의 자료입니다. Redis의 key는 문자열이므로 이 구조는 문자열(key)를 다른 문자열(value)에 맵핑한다고 보시면 될 것 같습니다. string 타입이라고는 하지만 모든 종류의 문자열(이진 데이터 포함)을 저장할 수 있습니다. 최대 저장 가능 사이즈 512MB입니다.

127.0.0.1:6379> set hello "world!"
OK
127.0.0.1:6379> get hello
"world!"

counter와 같은 Atomic Increment, Decrement가 가능합니다.

127.0.0.1:6379> get count
"-351"
127.0.0.1:6379> set count 50
OK
127.0.0.1:6379> incr count
(integer) 51
127.0.0.1:6379> get count
"51"
127.0.0.1:6379> incrby count 100
(integer) 151
127.0.0.1:6379> decr count
(integer) 150
127.0.0.1:6379> decrby count 500
(integer) -350

mset / mget 을 이용하여 여러 개의 키 값을 처리할 수 있습니다.

127.0.0.1:6379> mset a "hello" b "world"
OK
127.0.0.1:6379> mget a b
1) "hello"
2) "world"

List

Redis의 list는 linked list이며 특정 값이나 인덱스로 데이터를 조회/삭제가 가능합니다. LPUSH/RPUSH 와 같이 L/R은 왼쪽 오른쪽을 의미하며, lrange를 이용하여 리스트의 범위 찾기가 가능합니다. -1은 마지막 인덱스를 의미하므로 lrange list 0 -1 은 list라는 List의 요소를 모두 찾는 것과 같습니다.

127.0.0.1:6379> lpush list "A"
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "A"
127.0.0.1:6379> lpush list "B"
(integer) 2
127.0.0.1:6379> lpush list "C"
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "C"
2) "B"
3) "A"
127.0.0.1:6379> rpush list "D"
(integer) 4
127.0.0.1:6379> rpush list "E"
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "C"
2) "B"
3) "A"
4) "D"
5) "E"

Hash

Hash는 value 값으로 field-value 를 가진 데이터 구조입니다. key에 대한 field 갯수에는 제한이 없습니다. 일반적으로 관계형 DB에서의 table과 유사하며, hash key는 table의 PK, field는 column, value는 value로 볼 수 있습니다. key가 PK와 같은 역할을 하기 때문에 key 한 개는 table의 1 row와 같습니다.

127.0.0.1:6379> hmset user-1 email test@test.com country Korea
OK
127.0.0.1:6379> hmget user-1 email country
1) "test@test.com"
2) "Korea"

Set

set은 정렬되지 않은 문자열의 모음입니다. set의 아이템은 중복될 수 없으며 set은 key와 value가 1:N 관계입니다. 집합이라는 의미에서 value를 member라고 지칭합니다. 주로 집합연산이나 관계를 맺을 때 사용합니다.

# SADD : set에 데이터 추가 
127.0.0.1:6379> sadd nameSet "SungShin"
(integer) 1
# 중복 값 add 시 추가 안 됨
127.0.0.1:6379> sadd nameSet "SungShin"
(integer) 0
127.0.0.1:6379> sadd nameSet "Kimss"
(integer) 1
# SMEMBERS : set에 요소들을 조회
127.0.0.1:6379> smembers nameSet
1) "SungShin"
2) "Kimss"
# SISMEMBER : set에 입력한 요소가 존재하는 지 확인
127.0.0.1:6379> sismember nameSet "Sung"
(integer) 0
127.0.0.1:6379> sismember nameSet "SungShin"
(integer) 1
# SMOVE : 기존 set에서 새로운 set으로 입력한 아이템을 이동
127.0.0.1:6379> smove nameSet delSet "Kimss"
(integer) 1
127.0.0.1:6379> smembers nameSet
1) "SungShin"
127.0.0.1:6379> smembers delSet
1) "Kimss"

Sorted Set

일반적으로 set은 member들을 중복 없이 관리하기 위해 사용된다. 이 때 저장된 member들 사이의 순서는 관리되지 않는다. 하지만 Redis의 Sorted Set은 Set의 특성을 그대로 가지며 추가적으로 저장된 member들의 순서도 관리한다. 이 때 이 순서를 위해 각 value에 대해 score를 필요에 맞게 설정할 수 있으며, 이 score를 기반으로 정렬이 된다.

# ZADD : key에 score-member를 추가
127.0.0.1:6379> zadd fruit 2 apple
(integer) 1
127.0.0.1:6379> zadd fruit 10 banana
(integer) 1
# 복수개의 score-member를 추가할 수 있음
127.0.0.1:6379> zadd fruit 8 melon 4 orange 6 watermelon
(integer) 3
# 이미 추가 된 member를 add 시 score가 업데이트
127.0.0.1:6379> zadd fruit 15 apple
(integer) 0
# ZSCORE : member에 해당하는 score 값 리턴
127.0.0.1:6379> zscore fruit apple
"15"
# ZRANK : member에 해당하는 rank(순위) 값 리턴
127.0.0.1:6379> zrank fruit melon
(integer) 2
# ZRANGE : key에 해당하는 start - stop 내가 출력하고 싶은 요소를 추출
127.0.0.1:6379> zrange fruit 0 -1
1) "orange"
2) "watermelon"
3) "melon"
4) "banana"
5) "apple"

감사합니다.

'Programming > Database' 카테고리의 다른 글

Redis 개념 및 설치  (0) 2020.07.16
[MySQL] Query Plan 보는 법  (1) 2020.05.13
[MySQL] DB Time Zone 변경  (0) 2020.04.20
MongoDB 외부 접속 허용하기  (0) 2020.04.17
Linux Ubuntu에서 Mongo DB 설치하기  (0) 2020.04.17