개요
- Redis는 Key/Value 구조로 데이터를 저장하는 인메모리 데이터베이스입니다.
- Key는 텍스트 혹은 바이너리 형태로 저장되며, Redis는 매우 빠른 검색 성능을 자랑합니다.
- 예:
"name"
,"123"
,"@specialKey!"
- 예:
- Value는 문자열부터 리스트, 셋, 해시맵 등 다양한 타입을 가질 수 있으며, 일반적으로 512MB 크기 제한이 있습니다.
주요 명령어
TTL (Time To Live)
- TTL은 데이터의 생존 시간을 의미하며, 특정 키에 대한 데이터가 설정된 시간이 지나면 자동으로 삭제되도록 할 수 있습니다.
EXPIRE key seconds
: 지정한 시간(초)이 지나면 키가 자동으로 삭제됩니다.TTL key
: 해당 키의 남은 TTL 값을 초 단위로 반환합니다. 만약 TTL이 설정되지 않은 경우에는 -1을 반환하고, 이미 만료된 키는 -2를 반환합니다.
추가 설명:
- TTL은 Redis에서 캐시 데이터를 일정 시간 후에 자동으로 삭제할 때 유용합니다.
- TTL 설정 후 남은 시간을 확인할 수 있으며, TTL이 설정된 키는 Redis에서 설정된 시간이 지나면 자동으로 삭제됩니다.
- PERSIST 명령어를 사용하면 TTL 설정을 제거할 수 있습니다.
예시:
SET mykey "Hello"
EXPIRE mykey 10 # mykey는 10초 후에 자동으로 삭제됨
TTL mykey # 남은 TTL 값 확인, 예: 7
- TTL이 만료된 후 :
TTL mykey # -2 (만료됨)
GET mykey # (nil) (이미 삭제됨)
- TTL 설정 제거:
PERSIST mykey # TTL을 제거하여 mykey가 만료되지 않도록 설정
TTL mykey # -1 (TTL 없음)
DEL (Delete)
- DEL은 특정 키와 해당하는 값을 동기적으로 삭제합니다. 즉, 삭제 작업이 완료될 때까지 기다린 후 다음 명령어를 처리합니다.
추가 설명:
- 단순히 키를 삭제하는 명령어로, 키가 존재하지 않으면 아무 작업도 하지 않습니다.
- 삭제 작업은 키와 연관된 데이터의 크기에 따라 시간이 다소 소요될 수 있습니다.
예시:
SET mykey "Hello"
DEL mykey # mykey 삭제
GET mykey # (nil) (이미 삭제됨)
UNLINK (비동기적 삭제)
- UNLINK는 비동기적으로 키와 값을 삭제하는 명령어입니다. DEL과 달리 즉시 반환되며, 실제 삭제는 별도의 쓰레드에서 수행됩니다.
- 리스트(List), 셋(Set), 정렬된 셋(Sorted Set)과 같은 대형 자료 구조에서 삭제 작업을 비동기적으로 처리할 때 매우 유용합니다.
- 동기적 삭제는 많은 요소를 포함하는 큰 자료구조를 삭제할 때 시간이 오래 걸릴 수 있으며, 이는 서버의 응답 지연을 유발할 수 있습니다.
- 비동기적 삭제는 이러한 지연을 최소화하기 위해 삭제 작업을 백그라운드에서 처리합니다.
추가 설명:
- DEL은 즉시 키를 삭제하고 작업이 완료된 후 응답을 반환하는 반면, UNLINK는 응답을 즉시 반환하고 삭제 작업은 백그라운드에서 진행됩니다.
- 대규모 자료구조의 삭제 작업이 발생할 경우, DEL보다 UNLINK를 사용하는 것이 성능 상 더 유리합니다.
예시:
RPUSH mylist "a" "b" "c" # 리스트에 값 삽입
UNLINK mylist # 리스트 비동기적 삭제
- 동기적 삭제 예시:
RPUSH mylist "a" "b" "c"
DEL mylist # 동기적 삭제
MEMORY USAGE
- MEMORY USAGE 명령어는 특정 키에 대해 Redis가 실제로 사용한 메모리 크기를 반환합니다. 데이터의 실제 메모리 적재량을 확인할 수 있으며, 이를 통해 메모리 사용량을 분석하고 최적화할 수 있습니다.
추가 설명:
- Value의 크기뿐만 아니라 Redis가 내부적으로 데이터를 저장하는 방식에 따른 오버헤드를 포함한 실제 메모리 사용량을 반환합니다.
- 값이 복잡한 자료 구조일 경우(예: 리스트, 해시, 셋) 메모리 사용량은 값 자체 외에도 자료 구조를 관리하는 데 필요한 메타데이터를 포함하여 계산됩니다.
예시:
SET mykey "Hello"
MEMORY USAGE mykey # 키에 대한 메모리 사용량 반환 (예: 56 bytes)
- 복잡한 자료 구조 예시:
RPUSH mylist "a" "b" "c"
MEMORY USAGE mylist # 리스트의 메모리 사용량 반환
PERSIST
- PERSIST는 TTL이 설정된 키에서 TTL을 제거하여 영구적으로 유지하도록 만듭니다. 이 명령어를 통해 데이터의 만료를 방지할 수 있습니다.
예시:
SET mykey "Hello"
EXPIRE mykey 30 # 30초 후에 만료되도록 설정
PERSIST mykey # TTL 제거, 영구 보관
TTL mykey # -1 (TTL이 제거됨)
EXISTS
- EXISTS는 특정 키가 존재하는지 여부를 확인하는 명령어입니다. 키가 존재하면 1을 반환하고, 존재하지 않으면 0을 반환합니다.
예시:
SET mykey "Hello"
EXISTS mykey # 1 (존재함)
DEL mykey
EXISTS mykey # 0 (존재하지 않음)
요약
위에서 설명된 Redis의 주요 명령어는 데이터의 생존 시간 관리(TTL), 데이터 삭제(DEL, UNLINK), 메모리 사용량 확인(MEMORY USAGE) 등 다양한 상황에서 유용하게 사용할 수 있습니다. 또한, 각 명령어는 데이터 규모와 작업의 특성에 맞춰 성능 최적화를 고려해 선택할 수 있습니다.
- TTL과 PERSIST 명령어를 통해 데이터 만료 관리가 가능하고,
- DEL과 UNLINK 명령어를 통해 삭제 작업을 동기적 또는 비동기적으로 처리할 수 있으며,
- MEMORY USAGE 명령어를 통해 메모리 사용량을 최적화할 수 있습니다.
1. 문자열 (String)
Redis에서 가장 기본적인 데이터 타입이며, 문자열이나 숫자를 저장할 수 있습니다. 문자열은 최대 512MB까지 저장 가능하며, 숫자 데이터의 경우 증가(INCR), 감소(DECR) 등의 연산이 가능합니다.
주요 명령어
SET key value
: 키에 값을 저장.GET key
: 키에 저장된 값을 가져옴.INCR key
: 문자열 값을 숫자로 변환 후 1 증가.INCRBY key increment
: 지정한 숫자만큼 증가.DECR key
: 문자열 값을 숫자로 변환 후 1 감소.DECRBY key decrement
: 지정한 숫자만큼 감소.APPEND key value
: 기존 문자열에 새로운 문자열을 덧붙임.STRLEN key
: 문자열의 길이를 반환.MSET key1 value1 key2 value2
: 여러 키-값을 한 번에 설정.MGET key1 key2
: 여러 키의 값을 한 번에 가져옴.
예시:
SET user:1000 "Alice"
GET user:1000 # "Alice"
INCR user:count # 1
INCRBY user:count 5 # 6 숫자 5가 기존 1에 더하여진다. 결국 value는 6이됨
DECRBY user:count 2 # 4 INCRBY의 반대 메커니즘이다. 마이나스 연산을 한다. 즉 6 -2 = 4가 된다.
# 숫자 값(증가 감소에 따른)의 원자성을 보장해주기 위해 INCR, INCRBY, DECR, DECRBY를 사용하도록 하자.
APPEND user:1000 " is great" # "Alice is great"
STRLEN user:1000 # 14
2. 리스트 (List)
리스트는 삽입된 순서대로 값을 저장하는 자료구조입니다. 주로 스택(Stack), 큐(Queue), 데이터 스트림 등의 작업에 유용합니다.
주요 명령어
LPUSH key value
: 리스트의 왼쪽에 값 삽입.RPUSH key value
: 리스트의 오른쪽에 값 삽입.LPOP key
: 리스트의 왼쪽에서 값을 꺼냄.RPOP key
: 리스트의 오른쪽에서 값을 꺼냄.LRANGE key start stop
: 지정된 범위 내의 리스트 값들을 반환.LLEN key
: 리스트의 길이 반환.LSET key index value
: 리스트의 특정 인덱스에 있는 값을 설정.LREM key count value
: 리스트에서 지정된 값을 삭제.LINDEX key index
: 리스트의 특정 인덱스에 있는 값을 반환.
예시:
LPUSH mylist "apple"
LPUSH mylist "banana"
LRANGE mylist 0 -1 # ["banana", "apple"]
LPUSH books:favorites '{id: 100}'
LPUSH books:favorites '{id: 200}'
LRANGE books: favorites 0 1
1) "{id: 100}"
2) "{id: 200}"
LRANGE books:favorites 0 -1
1) "{id: 100}"
2) "{id: 200}"
LPOP books:favorites 1
1) "{id: 100}"
RPOP books:favorites 1
2) "{id: 200}"
RPOP mylist # "apple"
LPOP mylist # "banana"
RPUSH mylist "cherry"
LINDEX mylist 0 # "cherry"
LLEN mylist # 1
3. 셋 (Set)
셋(Set)은 정렬되지 않으며 중복되지 않는 고유한 값을 저장하는 자료구조입니다. 셋의 주요 장점은 교집합, 합집합, 차집합과 같은 집합 연산이 빠르다는 점입니다.
주요 명령어
SADD key value
: 셋에 값을 추가.SREM key value
: 셋에서 값을 제거.SISMEMBER key value
: 값이 셋에 포함되어 있는지 여부를 반환.SCARD key
: 셋에 저장된 요소의 수를 반환.SMEMBERS key
: 셋에 있는 모든 요소를 반환.SINTER key1 key2
: 두 셋의 교집합을 반환.SUNION key1 key2
: 두 셋의 합집합을 반환.SDIFF key1 key2
: 두 셋의 차집합을 반환.SRANDMEMBER key [count]
: 셋에서 랜덤하게 하나 이상의 요소를 반환.SPOP key [count]
: 셋에서 랜덤하게 하나 이상의 요소를 꺼내서 삭제.
예시:
SADD myset "apple"
SADD myset "banana"
SISMEMBER myset "apple" # 1 (존재함)
SCARD myset # 2
SMEMBERS myset # ["apple", "banana"]
SADD myset2 "banana"
SADD myset2 "cherry"
SINTER myset myset2 # ["banana"]
SUNION myset myset2 # ["apple", "banana", "cherry"]
SDIFF myset myset2 # ["apple"]
4. 정렬된 셋 (Sorted Set)
정렬된 셋(Sorted Set)은 점수(Score)를 기반으로 정렬된 셋입니다. 각 요소에 할당된 점수에 따라 자동으로 정렬되며, 주로 랭킹 시스템에서 사용됩니다.
주요 명령어
ZADD key score member
: 점수와 함께 요소를 추가.ZRANGE key start stop [WITHSCORES]
: 범위 내 요소들을 반환(작은 순서).ZREVRANGE key start stop [WITHSCORES]
: 범위 내 요소들을 반환(큰 순서).ZRANGEBYSCORE key min max [WITHSCORES]
: 점수 범위 내 요소들을 반환.ZREM key member
: 특정 요소를 삭제.ZCARD key
: 정렬된 셋의 요소 개수를 반환.ZSCORE key member
: 특정 요소의 점수를 반환.ZINCRBY key increment member
: 특정 요소의 점수를 증가.
예시:
ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES # ["Alice", 100, "Bob", 200]
ZREVRANGE leaderboard 0 -1 WITHSCORES # ["Bob", 200, "Alice", 100]
ZINCRBY leaderboard 50 "Alice" # Alice 점수를 50만큼 증가
ZSCORE leaderboard "Alice" # 150
# - `game:scores`는 Sorted Set의 이름이며, 각 사용자와 해당 점수가 추가됩니다.
# - `user1`, `user2` 등은 사용자 이름이고, 각 사용자에게 점수가 할당됩니다.
# - Sorted Set은 점수에 따라 자동으로 정렬되며, 이 순위는 나중에 조회할 때 사용할 수 있습니다.
127.0.0.1:6379> zadd game:scores 100 user1
(integer) 1
127.0.0.1:6379> zadd game:scores 250 user2
(integer) 1
127.0.0.1:6379> zadd game:scores 30 user3
(integer) 1
127.0.0.1:6379> zadd game:scores 40 user5
(integer) 1
127.0.0.1:6379> zadd game:scores 300 user6
(integer) 1
127.0.0.1:6379> zadd game:scores 150 user7
(integer) 1
127.0.0.1:6379> zadd game:scores 190 user8
(integer) 1
# - 모든 요소를 낮은 점수부터 높은 점수 순으로 반환합니다.
# - `0 -1`은 전체 범위를 의미하며, WITHSCORES 옵션을 추가하면 점수와 함께 반환됩니다.
#
127.0.0.1:6379> zrange game:scores 0 -1 withscores
1) "user3"
2) "30"
3) "user5"
4) "40"
5) "user1"
6) "100"
7) "user7"
8) "150"
9) "user8"
10) "190"
11) "user2"
12) "250"
13) "user6"
14) "300"
# - 모든 요소를 **낮은 점수부터 높은 점수** 순으로 반환합니다.
# - `0 -1`은 전체 범위를 의미하며, **WITHSCORES** 옵션을 추가하면 점수와 함께 반환됩니다.
127.0.0.1:6379> zrange game:scores 0 +inf byscore limit 0 3 withscores
1) "user3"
2) "30"
3) "user5"
4) "40"
5) "user1"
6) "100"
# - 이 명령어는 **점수 기반으로 정렬**된 사용자 중 **상위 3명**을 반환하는 명령어입니다.
# - `BYSCORE` 옵션을 사용하여 점수를 기준으로 정렬하고, `LIMIT 0 3`은 상위 3명의 결과만 반환하는 것을 의미합니다.
# - 결과는 **낮은 점수**에서 **높은 점수** 순으로 반환됩니다.
127.0.0.1:6379> zrange game:scores +inf 0 byscore rev limit 0 3 withscores
1) "user6"
2) "300"
3) "user2"
4) "250"
5) "user8"
6) "190"
5. 해시 (Hash)
해시(Hash)는 필드-값(Field-Value) 쌍을 저장하는 자료구조로, 하나의 키에 여러 값을 저장할 수 있습니다. 데이터베이스 레코드나 JSON 구조의 데이터를 저장하는 데 유용합니다.
주요 명령어
HSET key field value
: 해시에 필드와 값을 설정.HGET key field
: 특정 필드의 값을 반환.HGETALL key
: 해시에 있는 모든 필드와 값을 반환.HDEL key field
: 특정 필드를 삭제.HLEN key
: 해시에 있는 필드 수를 반환.HEXISTS key field
: 필드가 존재하는지 여부를 반환.HMSET key field1 value1 field2 value2
: 여러 필드를 한 번에 설정.HMGET key field1 field2
: 여러 필드를 한 번에 조회.HINCRBY key field increment
: 해시 자료구조에서 value의 정수 값을 원자적으로 수정 및 관리
예시:
HSET user:1000 name "Alice"
HSET user:1000 age 30
HGET user:1000 name # "Alice"
HGETALL user:1000 # ["name", "Alice", "age", "30"]
HSET user:1000 email "hyeseong43@gmail.com" hobbies '["workout", "listening music"]'
127.0.0.1:6379> HGETALL user:1000
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "email"
6) "hyeseong43@gmail.com"
7) "hobbies"
8) "[\"workout\", \"listening music\"]"
127.0.0.1:6379> HDEL user:1000 age
(integer) 1
127.0.0.1:6379> HLEN user:1000
(integer) 3
6. Geospatial (지리 데이터)
Redis의 Geospatial 데이터 타입은 위도와 경도 데이터를 저장하고, 거리 계산 및 반경 검색을 제공하는 기능입니다. 위치 기반 서비스에 유용하게 사용됩니다.
주요 명령어
GEOADD key longitude latitude member
: 좌표 데이터를 저장.GEODIST key member1 member2 [unit]
: 두 좌표 간의 거리 계산.GEORADIUS key longitude latitude radius [unit]
: 특정 좌표를 중심으로 반경 내의 값을 검색.GEORADIUSBYMEMBER key member radius [unit]
: 특정 좌표 멤버를 기준으로 반경 내의 값을 검색.GEOPOS key member
: 특정 좌표 멤버의 위도와 경도를 반환.
예시:
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
GEODIST locations "Palermo" "Catania" km # 두 도시 간의 거리 계산
GEORADIUS locations 15 37 200 km # 반경 200km 내의 위치 검색
7. Bitmap (비트맵)
Bitmap은 비트를 이용해 데이터를 저장하고, 비트 단위의 연산을 제공하는 자료구조입니다. 사용자 상태 추적이나 대규모 집합을 관리하는 데 유용합니다.
주요 명령어
SETBIT key offset value
: 특정 비트의 값을 설정.GETBIT key offset
: 특정 비트의 값을 반환.BITCOUNT key [start end]
: 비트 값이 1인 비트의 개수를 반환.BITOP operation destkey key1 [key2 ...]
: 비트 연산을 수행(AND
,OR
,XOR
).
예시:
SETBIT mybitmap 1 1
SETBIT mybitmap 2 0
GETBIT mybitmap 1 # 1
BITCOUNT mybitmap # 1
8. HyperLogLog
HyperLogLog는 대규모 데이터 집합에서 고유 항목 수를 매우 효율적으로 추정하는 자료구조입니다. 메모리 사용량을 최소화하면서 고유 항목의 개수를 추정할 수 있습니다.
주요 명령어
PFADD key element
: 고유 항목을 추가.PFCOUNT key
: 고유 항목 수를 반환.PFMERGE destkey sourcekey
: 여러 HyperLogLog를 병합.
예시:
PFADD visitors "user1"
PFADD visitors "user2"
PFCOUNT visitors # 2
결론:
Redis는 다양한 데이터 타입과 명령어를 제공하여 효율적인 메모리 사용과 빠른 성능을 자랑하는 인메모리 데이터베이스입니다. 각 데이터 타입에 맞는 다양한 명령어를 통해 캐싱, 세션 관리, 실시간 데이터 처리 등을 효율적으로 처리할 수 있습니다.
'DB > Redis' 카테고리의 다른 글
Redis Hash 실습: 키-필드-값 데이터 구조 관리하기 (0) | 2024.09.11 |
---|---|
Redis Set 실습: 집합 연산과 활용법 (0) | 2024.09.11 |
Redis 문자열 실습: 기본 데이터 타입 다루기 (1) | 2024.09.11 |
Redis CLI 사용법: 명령어로 시작하기 (1) | 2024.09.11 |
Redis 입문: 기본 개념 톺아보기 (0) | 2024.09.11 |