이번 포스팅은 Redis 데이터 타입을 공부하고 지식을 정리하고자 쓴 글입니다.
Redis는 메모리 기반의 데이터 저장소로, 뛰어난 성능과 유연성을 제공합니다. Redis의 가장 큰 장점 중 하나는 다양한 데이터 타입을 지원한다는 점입니다.
Redis에서 대부분의 명령어는 키를 바탕으로 동작하며, 값의 데이터 타입에 따라 서로 다른 명령어를 사용합니다. 이로 인해 데이터를 보다 효율적으로 관리하고 사용할 수 있습니다.
인메모리 저장소와 Redis에 대한 자세한 내용은 다음 포스팅에서 확인 가능합니다.▼
Redis 주요 데이터 타입
Redis에서 지원하는 주요 데이터 타입은 다음과 같습니다.
- 문자열 (String)
- 해시 (Hash)
- 리스트 (List)
- 집합 (Set)
- 정렬된 집합 (Sorted Set)
- 비트맵 (Bitmap)
- 하이퍼로그로그 (HyperLogLog)
- 지오스페이셜 (Geospatial)
- 스트림 (Stream)
1. 문자열 (String)
Redis에서 가장 기본적인 데이터 타입입니다. Redis가 Java의 Map <String, String>처럼 동작한다고 생각하면서 접근하면 편합니다.
SET key "value"
GET key
- 지원하는 명령어
- SET, GET, MGET, SETEX, INCR, DECR 등.
- SET <key> <value>: key에 value문자열 데이터를 저장합니다.
- GET <key>: key에 저장된 문자열 반환
GET은 그냥 데이터를 가져오는 것이 아니라, 문자열데이터를 돌려줘라는 뜻입니다.
INCR, DECR
SET user:count 1
INCR user:count
DECR user:count
- INCR key
- 주어진 키의 값을 정수로 간주하고 1을 증가시킵니다.
- 키가
존재하지 않으면 값이 0으로 간주되고 1이 설정됩니다.
- DECR key
- 주어진 키의 값을 정수로 간주하고 1을 감소시킵니다.
- 키가 존재하지 않으면 값이 0으로 간주되고 -1이 설정됩니다.
INCRBY, DECRBY
INCRBY mycounter 10
- INCRBY key increment
- 주어진 키의 값을 정수로 간주하고 지정된 값만큼 증가시킵니다.
DECRBY mycounter 10
- DECRBY key decrement
- 주어진 키의 값을 정수로 간주하고 지정된 값만큼 감소시킵니다.
MSER, MGET
MSET key1 value1 key2 value2 ... keyN valueN
- MSET key value [key value …]: key value
- 여러 개의 키-값 쌍을 동시에 설정합니다.
- 모든 키-값 쌍이 성공적으로 설정되면 OK를 반환합니다. 만약 하나라도 실패하면 전체 작업이 취소됩니다.
MSET user:1000 "Alice" user:1001 "Bob" user:1002 "Charlie"
위 명령어는 user:1000에 "Alice"를, user:1001에 "Bob"을, user:1002에 "Charlie"를 동시에 설정합니다.
MGET user:1000 user:1001 user:1002
- MGET key [key]
- 주어진 모든 key에 해당하는 데이터를 반환합니다.
단순 문자열도 실제로는 바이트 배열로 저장됩니다.
따라서 문자열 데이터 타입을 사용하여 이미지, 음성, 영상, 파일, 이메일 본문 등 다양한 형태의 데이터를 저장할 수 있습니다.
이를 통해 분산된 구조에서 비교적 큰 사이즈의 데이터를 처리해야 할 때, 데이터의 실제 내용은 Redis에 저장하고, 필요한 경우 키만 전달하여 데이터를 참조하는 방식으로 활용할 수 있습니다.
2. 리스트(List)
Redis의 리스트는 순서가 있는 문자열의 컬렉션으로, 양쪽 끝에서 추가와 삭제가 가능합니다.
리스트는 FIFO(First-In-First-Out) 방식의 큐 또는 LIFO(Last-In-First-Out) 방식의 스택으로 사용할 수 있습니다.
LPUSH, RPUSH
LPUSH key value [value ...]
- LPUSH key value [value...]
- 설명: 리스트의 왼쪽(앞쪽) 끝에 하나 이상의 값을 추가합니다.
- RPUSH key value [value...]
- 설명: 리스트의 오른쪽(뒤쪽) 끝에 하나 이상의 값을 추가합니다.
LPOP, RPOP
LPOP key
RPOP key
- LPOP key
- 설명: 리스트의 왼쪽(앞쪽) 끝에서 값을 제거하고 반환합니다.
- RPOP key
- 설명: 리스트의 오른쪽(뒤쪽) 끝에서 값을 제거하고 반환합니다.
LRANGE, LLEN
LRANGE key start stop
LLEN ke
- LRANGE key start stop
- 리스트의 특정 범위의 요소를 반환합니다.
- start와 stop은 인덱스를 지정합니다.
- end가 실제 길이를 벗어나도
오류가 발생하진 않습니다. - start > end일 경우 빈 결과가 반환됩니다.
- 음수의 경우 리스트의 뒤에서부터 데이터를 가져옵니다.
- 리스트의 특정 범위의 요소를 반환합니다.
위 코드의 경우 0 -3 명령어를 실행하면, 0부터 -3까지의 범위를 조회합니다. -3은 리스트의 끝에서 세 번째 요소를 의미하지만, 현재 리스트는 [Park, Choi]로 2개의 요소만 포함되어 있기 때문에 -3번째 요소는 존재하지 않습니다. 따라서 범위가 유효하지 않아 결과는 빈 리스트가 됩니다.
- LLEN key
- 설명: 리스트의 길이(요소 개수)를 반환합니다.
LINDEX
- LINDEX key index
- 설명: 리스트의 특정 인덱스에 있는 요소를 반환합니다.
- 예제: LINDEX mylist 1
- mylist 리스트의 인덱스 1에 있는 요소를 반환합니다.
LSET
- LSET key index value
- 설명: 리스트의 특정 인덱스에 있는 요소를 새로운 값으로 설정합니다.
- 예제: LSET mylist 1 "new_value"
- mylist 리스트의 인덱스 1에 있는 요소를 "new_value"로 변경합니다.
LREM
- LREM key count value
- 설명: 리스트에서 지정한 값과 일치하는 첫 번째 또는 마지막 요소를 제거합니다. count는 제거할 요소의 개수를 지정합니다.
- 예제: LREM mylist 2 "value_to_remove"
- mylist 리스트에서 "value_to_remove" 값이 있는 요소를 최대 2개 제거합니다.
LTRIM
- LTRIM key start stop
- 설명: 리스트의 특정 범위에 해당하는 요소만 남기고 나머지를 제거합니다.
- 예제: LTRIM mylist 1 3
- mylist 리스트에서 인덱스 1부터 3까지의 요소만 남기고 나머지는 제거합니다.
리스트의 경우 소셜 네트워크(SNS)에서 많이 사용하는 자료형입니다. 대표적으로 X (구 트위터)가 List를 바탕으로 Timeline을 구성했다고 합니다.
만약 "GET user:list"로 데이터를 가져온다고 하면, 위와 같이 오류가 발생합니다. 앞서 알아보았듯이 redis는 명령어가 자료형에 따라 정해져 있기 때문입니다.
따라서 user:list라고 하는 Key에다가 "PUSH" 명령어로 리스트 타입으로 데이터를 저장했기 때문에 문자열 데이터에 해당하는 "GET" 명령어가 사용할 수 없기 때문에 오류가 발생한 것입니다.
즉, Key에 저장된 자료형이 다를 경우 오류 발생
문제가 되는 상황은 해당하는 키가 다른 자료형 데이터를 담고 있을 때만 문제가 된다.
3. Set
Set은 은 중복을 허용하지 않는 문자열의 집합입니다. Set을 사용하면 데이터의 중복을 방지하고, 집합 간의 교집합, 합집합, 차집합 등의 집합 연산을 쉽게 수행할 수 있습니다.
SADD, SREM
SADD key member [member ...]
- 집합에 하나 이상의 요소를 추가합니다. 요소가 이미 집합에 존재하면 무시됩니다.
SREM key member [member ...]
- 집합에서 하나 이상의 요소를 제거합니다. 요소가 집합에 존재하지 않으면 무시됩니다.
SISMEMBER, SMEMBERS
SISMEMBER key member
- 지정한 요소가 집합에 존재하는지 확인합니다. 존재하면 1, 아니면 0을 반환합니다.
- 대소문자도 구별합니다.
SMEMBERS key
- 집합에 있는 모든 요소를 반환합니다.
SCARD
SCARD key
- 집합의 요소 개수를 반환합니다. (크기 반환)
SDIFF
SDIFF key [key ...]
- 설명: 하나 이상의 집합에서 다른 집합의 요소를 제외한 요소를 반환합니다. (차집합)
- 예제: SDIFF set1 set2
- set1에서 set2의 요소를 제외한 요소를 반환합니다.
SINTER
SINTER key [key ...]
- 설명: 하나 이상의 집합의 교집합을 반환합니다.
- 예제: SINTER set1 set2
- set1과 set2의 교집합을 반환합니다.
SUNION
SUNION key [key ...]
- 설명: 하나 이상의 집합의 합집합을 반환합니다.
- 예제: `SUNION set1 set2`
- `set1`과 `set2`의 합집합을 반환합니다.
중복을 허용하지 않으며, 어떤 데이터의 존재 여부를 확인하는 SISMEMBER 같은 경우 O(1)의 시간복잡도를 가지고 있습니다. 그래서 중복 없는 방문 수, 인증 토큰 블랙리스트 등을 구현할 때 활용할 수 있습니다.
4. 정렬된 Set(Sorted Set)
정렬된 셋은 셋과 유사하지만, 각 요소가 점수(score)와 함께 저장되며, 점수에 따라 자동으로 정렬됩니다. 이 데이터 타입은 순위 계산 및 점수 기반 정렬에 유용합니다.
ZADD, ZREM
ZADD key score member [score member ...]
- 설명: 정렬된 집합에 하나 이상의 요소를 추가하거나 업데이트합니다. 요소는 점수와 함께 저장됩니다.
- 예제: ZADD myzset 1 "one" 2 "two"
- myzset에 점수 1과 2를 가진 "one"과 "two"를 추가합니다. 기존에 같은 요소가 있으면 점수가 업데이트됩니다.
ZREM key member [member ...]
- 설명: 정렬된 집합에서 지정한 범위의 요소를 반환합니다. WITHSCORES 옵션을 사용하면 점수와 함께 반환됩니다.
- 예제: ZRANGE myzset 0 1 WITHSCORES
- myzset에서 인덱스 0부터 1까지의 요소와 그 점수를 반환합니다.
ZRANGE, ZREVRANGE
ZRANGE key start stop [WITHSCORES]
- 설명: 정렬된 집합에서 지정한 범위의 요소를 반환합니다. WITHSCORES 옵션을 사용하면 점수와 함께 반환됩니다.
- 예제: ZRANGE myzset 0 1 WITHSCORES
- myzset에서 인덱스 0부터 1까지의 요소와 그 점수를 반환합니다.
ZREVRANGE key start stop [WITHSCORES]
- 설명: 정렬된 집합에서 지정한 범위의 요소를 내림차순으로 반환합니다. WITHSCORES 옵션을 사용하면 점수와 함께 반환됩니다.
- 예제: ZREVRANGE myzset 0 1 WITHSCORES
- myzset에서 인덱스 0부터 1까지의 요소를 내림차순으로 반환합니다.
ZRANK, ZREVRANK
ZRANK key member
- 설명: 정렬된 집합에서 지정한 요소의 순위를 반환합니다. 순위는 0부터 시작합니다.
- 예제: ZRANK myzset "one"
- myzset에서 "one"의 순위를 반환합니다.
ZREVRANK key member
- 설명: 정렬된 집합에서 지정한 요소의 내림차순 순위를 반환합니다.
- 예제: ZREVRANK myzset "one"
- myzset에서 "one"의 내림차순 순위를 반환합니다.
ZSCORE
ZSCORE key member
- 설명: 정렬된 집합에서 지정한 요소의 점수를 반환합니다.
- 예제: ZSCORE myzset "one"
- myzset에서 "one"의 점수를 반환합니다.
ZCARD
ZCARD key
- 설명: 정렬된 집합의 총 요소 개수를 반환합니다.
- 예제: ZCARD myzset
- myzset의 총 요소 개수를 반환합니다.
ZCOUNT
ZCOUNT key min max
- 설명: 정렬된 집합에서 점수가 min과 max 범위에 있는 요소의 개수를 반환합니다.
- 예제: ZCOUNT myzset 1 2
- myzset에서 점수가 1 이상 2 이하인 요소의 개수를 반환합니다.
Sorted Set은 대표적으로 리더보드나 Rate Limiter, 즉 순위와 관련된 기능을 만드는 데 사용됩니다.
4. Hash
해시는 필드와 값의 쌍을 저장하는 데이터 구조로, 객체의 속성 및 값을 저장하는 데 적합합니다. 해시를 사용하면 관련된 데이터를 그룹화하여 저장하고, 각 필드에 대해 효율적으로 접근할 수 있습니다.
HSET, HGET
HSET key field value [field value ...]
- 설명: 해시에서 하나 이상의 필드와 값을 설정합니다. 필드가 이미 존재하면 값을 업데이트합니다.
- 예제: HSET myhash name "John" age 30
- myhash 해시에 "name" 필드를 "John"으로, "age" 필드를 30으로 설정합니다.
HGET key field
- 설명: 해시에서 지정한 필드의 값을 반환합니다.
- 예제: HGET myhash name
- myhash 해시의 "name" 필드의 값을 반환합니다.
HSET, HGET
HGETALL key
- 설명: 해시의 모든 필드와 값을 반환합니다. 결과는 필드와 값이 번갈아 나오는 형태입니다.
- 예제: HGETALL myhash
- myhash 해시의 모든 필드와 값을 반환합니다.
HMSET, HMGET
HMSET key field value [field value ...]
- 설명: 여러 필드와 값을 한 번에 설정합니다. (Redis 4.0부터 HSET 명령어가 HMSET의 기능을 포함하여 HMSET은 더 이상 사용되지 않는 것이 권장됩니다.)
- 예제: HMSET myhash name "John" age 30
- myhash 해시에 "name" 필드를 "John"으로, "age" 필드를 30으로 설정합니다.
HMGET key field [field ...]
- 설명: 해시에서 하나 이상의 필드의 값을 반환합니다.
- 예제: HMGET myhash name age
- myhash 해시의 "name"과 "age" 필드의 값을 반환합니다.
HDEL
HDEL key field [field ...]
- 설명: 해시에서 하나 이상의 필드를 삭제합니다. 필드가 존재하지 않으면 무시됩니다.
- 예제: HDEL myhash age
- myhash 해시에서 "age" 필드를 삭제합니다.
HEXISTS
HEXISTS key field
- 설명: 해시에서 지정한 필드가 존재하는지 확인합니다. 존재하면 1, 아니면 0을 반환합니다.
- 예제: HEXISTS myhash name
- myhash 해시에 "name" 필드가 존재하는지 확인합니다.
HKEYS
HKEYS key
- 설명: 해시에서 모든 필드의 이름을 반환합니다.
- 예제: HKEYS myhash
- myhash 해시의 모든 필드 이름을 반환합니다.
HLEN
HLEN key
- 설명: 해시의 필드 개수를 반환합니다.
- 예제: HLEN myhash
- `myhash` 해시의 필드 개수를 반환합니다.
Hash는 본래 하나의 키에 복잡한 데이터(예: 객체의 속성)를 저장하는 용도로 주로 활용됩니다. Redis 공식 문서에서도 여러 Key에 걸쳐 객체 데이터를 표현하기보다는 Hash를 사용하는 것을 권장하고 있습니다.
예를 들어, 장바구니 기능을 구현할 때는 사용자별로 장바구니 정보를 저장해야 합니다. 이 경우, 사용자마다 하나의 Hash를 생성하고,
물품 - 개수 형식으로 데이터를 저장하면 사용자별 장바구니를 효율적으로 관리할 수 있습니다.
'Database > redis' 카테고리의 다른 글
[Redis] Spring Boot와 Redis로 세션 클러스터링 구현하기 (0) | 2024.08.11 |
---|---|
[Redis] Spring boot에서의 Redis사용하기 #2 : RedisTemplate (0) | 2024.08.10 |
[Redis] Spring boot에서의 Redis사용하기 #1 : RedisRepository (0) | 2024.08.10 |
[Redis] 인메모리 저장소와 redis란 무엇일까❓ (0) | 2024.08.06 |