백앤드(Back-End)/Redis

[Redis] 자료구조 개념 및 사용법

RyanSin 2021. 9. 6. 00:20
반응형

- 개요

안녕하세요. 이번 시간에는 Redis에서 사용하는 각 자료구조에 대해 알아보겠습니다.

 

기본적으로 Redis는 Open Source이며, In-Memory Data Store라고 Cache 서버라고 설명합니다.

 

In-Memory Cache 서버이기 때문에 기본적인 RAM에 데이터를 저장합니다.

 

속도가 빠르다는 이점이 있지만 컴퓨터가 종료되거나 서버가 장애가 발생해서 종료되는 경우 데이터를 보존하지 못하는 단점이 있습니다.

 

Redis 서버를 사용할 때 전략을 잘 구성해서 사용해야 합니다.

 

- 설명

Redis에서 사용되는 자료 구조는  Strings, Hashes, Lists, Sets, Sorted Sets 그리고 범위 쿼리를 검색할 수 있는 Bitmaps, Hyperloglogs, Geospatial indexes, 마지막으로 Streams과 같은 데이터 구조가 있습니다.

 

Redis는 자료를 저장할 때 Key/Value 형태로 저장합니다. Hash 자료 구조를 생각하면 어떤 식으로 형태로 저장하는지 딱 직감하실 겁니다.

- Strings(문자열)

String 자료형은 단순히 Key/Value 형태가 값을 저장합니다.

명령어 
# 데이터 저장 (set key value)
127.0.0.1:6379> set user ryan

# 데이터 조회 (get key)
127.0.0.1:6379> get user

 

- Set(집합)

Set은 집합형 Data Type으로 정렬되지 않고 중복되지 않는 데이터를 저장합니다.

집합형 자료형이기 때문에 합집합, 교집합, 차집합과 같은 연산도 가능합니다.

명령어
# 데이터 저장 (sadd key value)
127.0.0.1:6379> sadd user ryan

# 다중 저장 (sadd key value value value)
127.0.0.1:6379> sadd user ryan ryan1 ryan2

# 데이터 조회 (smembers key)
127.0.0.1:6379> smembers user

 

집합
# 임시 데이터
127.0.0.1:6379> sadd user1 ryan1 ryan2 ryan3 ryan4
127.0.0.1:6379> sadd user2 ryan2 ryan3 ryan4 ryan5 ryan6

#차집합 연산 (user1에만 포함된 정보를 조회)
127.0.0.1:6379> sdiff user1 user2
ryan1

#차집합 연산 (user2에만 포함된 정보를 조회)
127.0.0.1:6379> sdiff user2 user1
ryan5
ryan6

#교집합 (user1과 user2 공통정보 조회)
127.0.0.1:6379> sinter user1 user2
ryan3
ryan4
ryan2

#합집합 (user1과 user2 정보를 합친다.)
127.0.0.1:6379> sunion user1 user2
ryan2
ryan3
ryan5
ryan1
ryan4
ryan6

 

-Sorted Set(정렬된 집합)

Set 자료구조는 value 값을 정렬하지 않는다. Sorted Set 자료구조는 Set 자료구조와 다르게 value 값을 score 기준으로 정렬합니다.

명령어
#데이터 저장(zadd key score value)
127.0.0.1:6379> zadd user 0 ryan
127.0.0.1:6379> zadd user 1 ryan2
127.0.0.1:6379> zadd user 2 ryan5
127.0.0.1:6379> zadd user 5 ryan3
127.0.0.1:6379> zadd user 4 ryan4

#데이터 전체 조회(zrange key 시작(score) 끝(score))
127.0.0.1:6379> zrange user 0 -1
ryan
ryan2
ryan5
ryan4
ryan3

- List(목록)

LIst 자료구조는 Linked List 형태여서 lpush, rpush 같은 List에 오른쪽과 왼쪽에 데이터를 저장할 수 있습니다.

그리고 Set과 다르게 중복된 데이터를 저장할 수 있습니다.

명령어
#데이터 저장(lpush/rpush key value)
127.0.0.1:6379> lpush user ryan
127.0.0.1:6379> rpush user ryan2

#데이터 조회(lrange key 시작(인덱스) 끝(인덱스))
127.0.0.1:6379> lrange user 0 10
LPUSHX / RPUSHX

LPUSHX / RPUSHX는 존재하는 Key에만 Push 작업이 가능하다.

Key가 없다면 데이터를 저장할 수 없습니다.

 

- Hash(Field/Value)

Hash구조는 우리가 생각하는 Hash 자료구조 성격을 가진다.

Redis는 기본적으로 Key/Value Store인데...? Hash가 있다? 이상할 수 있다고 생각하지만, 데이터를 저장하는 방식 중 하나라고 생각하면 이해를 할 수도 있다.

 

Redis Key 하나에 여러개의 Field와 Value가 존재한다. 객체 지향 언어를 사용해 보셨다면, Class에 Field 변수를 생각할 수 있습니다.

명령어
#데이터 저장(hset key field value)
127.0.0.1:6379> hset user name ryan

#데이터 조회(hget key field)
127.0.0.1:6379> hget user name

 

이번 시간에는 Redis에서 사용되는 자료 구조에 대해서 알아봤습니다.