일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Redis
- Spring Frame Work
- 이것이 자바다
- 일정관리프로젝트
- LV0
- 배열
- LV.02
- 디자인 패턴
- 알고리즘
- mysql
- 연습문제
- Java
- docker
- 프로그래머스
- JPA
- SQL
- CoffiesVol.02
- Lv.0
- 포트폴리오
- LV02
- Join
- Til
- 데이터 베이스
- jpa blog
- 네트워크
- LV1
- 코테
- LV01
- 포트 폴리오
- LV03
- Today
- Total
코드 저장소.
Redis의 자료구조 본문
목차
1.Redis의 자료구조
2.String
3.List
4.Hashes
5.Sets
6.Sorted sets
1.Redis의 자료구조
Redis는 기본적으로 다야한 형태의 자료구조를 제공을 하고 있다. Redis의 자료구조는 다음과 같습니다.
- Strings : Vinary-safe한 기본적인 key-value 구조
- Lists : String element의 모음, 순서는 삽입된 순서를 유지하며 기본적인 자료구로 Linked List를 사용
- Sets : 유일한 값들의 모임인 자료구조, 순서는 유지되지 않음
- Sorted sets : Sets 자료구조에 score라는 값을 추가로 두어 해당 값을 기준으로 순서를 유지
- Hahses : 내부에 key-value 구조를 하나더 가지는 Reids 자료구조
- Bit arrays(bitMaps) : bit array를 다를 수 있는 자료구조
- HyperLogLogs : HyperLogLog는 집합의 원소의 개수를 추정하는 방법, Set 개선된 방법
- Streams : Redis 5.0 에서 Log나 IoT 신호와 같이 지속적으로 빠르게 발생하는 데이터를 처리하기 위해서 도입된 자료구조
2.String
String 타입은 가장 기본적이고 간단한 데이터 구조로, 키와 값 쌍으로 데이터를 저장합니다. Redis의 String은 여러 가지 용도로 사용될 수 있으며, 다양한 명령어를 통해 문자열 데이터를 저장하고 조작할 수 있습니다
String타입의 특징은 다음과 같습니다.
- 단일 값 저장:
- Redis String은 하나의 키에 대해 하나의 값을 저장합니다. 이 값은 문자열, 정수, 부동 소수점 숫자 등 다양한 형태로 저장할 수 있습니다.
- 바이트 길이:
- Redis의 String 값은 최대 512MB까지 저장할 수 있습니다. 이 값은 이론적인 한계이며, 실제 사용 시에는 시스템 메모리나 성능 문제로 인해 이보다 적은 크기의 데이터를 사용하는 것이 일반적입니다.
- 자동 타입 변환:
- String 값은 내부적으로 문자열로 저장되지만, 정수나 부동 소수점 숫자와 같은 타입도 문자열로 저장됩니다. Redis는 명령어를 실행할 때 이 타입을 자동으로 변환합니다.
String타입의 명령어는 SET, GET, INCR, DECR, APPEND, STRLEN이 있습니다.
SET: 주어진 키에 문자열 값을 설정합니다. 키가 이미 존재하면 기존 값을 덮어씁니다.
//구문
SET key value
//예시
SET mykey "Hello, Redis!"
위의 명령어에서 첫번째가 SET구문을 보여주는 것입니다.
아래의 예시로 mykey라는 키값에 value값은 "Hello, Redis !"라는 값을 넣는 예시입니다.
GET: 주어진 키에 대한 값을 반환합니다. 키가 존재하지 않으면 nil을 반환합니다.
//구문
GET key
//예시
GET mykey
이 명령어는 mykey에 저장된 값을 반환합니다.
만약 mykey가 "Hello, Redis!"로 설정되어 있다면, 이 값을 반환합니다.
INCR : 주어진 키의 값을 정수로 간주하고 1을 증가시킵니다. 키가 존재하지 않으면 0으로 초기화한 후 1을 증가시킵니다.
//구문
INCR key
//예시
SET counter 10 INCR counter
이 명령어는 counter의 값을 11로 증가시킵니다. 만약 counter가 초기에는 10으로 설정되어 있었다면, 결과는 11입니다.
DECR : 주어진 키의 값을 정수로 간주하고 1을 감소시킵니다. 키가 존재하지 않으면 0으로 초기화한 후 1을 감소시킵니다.
//구문
DECR key
//예시
SET counter 10 DECR counter
이 명령어는 counter의 값을 9로 감소시킵니다. 만약 counter가 초기에는 10으로 설정되어 있었다면, 결과는 9입니다.
APPEND: 주어진 키에 문자열 값을 추가합니다. 키가 존재하면 기존 값의 끝에 문자열을 추가하고, 키가 존재하지 않으면 새로운 키를 생성합니다.
//구문
APPEND key value
//예시
SET mykey "Hello" APPEND mykey " World"
이 명령어는 mykey에 " World"를 추가하여 최종 값이 "Hello World"가 됩니다.
STRLEN : 주어진 키의 문자열 값의 길이를 반환합니다. 키가 존재하지 않으면 0을 반환합니다.
//구문
STRLEN key
//예시
SET mykey "Hello, Redis!"
STRLEN mykey
이 명령어는 mykey의 문자열 값 "Hello, Redis!"의 길이를 반환합니다. 결과는 13입니다.
3.List
List타입은 리스트 자료구조를 제공하며, 연결된 리스트 형태로 데이터를 저장합니다. Redis List는 FIFO(First In, First Out) 큐 및 LIFO(Last In, First Out) 스택 작업을 수행할 수 있는 유연한 데이터 구조입니다.
Redis List타입의 특징
- 순서 유지:
- Redis List는 데이터가 삽입된 순서대로 값을 저장합니다. 리스트의 각 원소는 인덱스가 부여되어 있으며, 인덱스는 0부터 시작합니다.
- 중복 허용:
- 리스트는 중복된 값을 허용합니다. 동일한 값을 여러 번 추가할 수 있습니다.
- 다양한 명령어:
- Redis는 List를 조작하기 위한 다양한 명령어를 제공합니다. 이 명령어들을 사용하여 리스트의 원소를 추가, 삭제, 조회, 범위 조회 등을 수행할 수 있습니다.
- 양방향 작업:
- 리스트의 원소를 양쪽 끝에서 추가하거나 제거할 수 있어 큐와 스택의 두 가지 자료구조를 모두 구현할 수 있습니다.
List의 명령어는 LPUSH, RPUSH, LPOP, RPOP, LRANGE 가 있습니다.
LPUSH: 리스트의 왼쪽(앞쪽)에 하나 이상의 원소를 추가합니다.
//구문
LPUSH key element [element ...]
//예제
LPUSH mylist "world"
LPUSH mylist "hello"
위 명령어는 mylist 리스트의 왼쪽에 "world"와 "hello"를 추가합니다.
RPUSH:리스트의 오른쪽(뒤쪽)에 하나 이상의 원소를 추가합니다.
//구문
RPUSH key element [element ...]
//예제
RPUSH mylist "hello"
RPUSH mylist "world"
위 명령어는 mylist 리스트의 오른쪽에 "hello"와 "world"를 추가합니다.
LPOP:리스트의 왼쪽(앞쪽)에서 원소를 제거하고 반환합니다.
//구문
LPOP key
//예제
LPOP mylist
위 명령어는 mylist 리스트의 왼쪽에서 원소를 제거하고 반환합니다.
RPOP:리스트의 오른쪽(뒤쪽)에서 원소를 제거하고 반환합니다.
//구문
RPOP key
//예제
RPOP mylist
위 명령어는 mylist 리스트의 오른쪽에서 원소를 제거하고 반환합니다.
LRANGE:리스트의 지정된 범위의 원소를 반환합니다.
//구문
LRANGE key start stop
//예제
LRANGE mylist 0 -1
위 명령어는 mylist 리스트의 모든 원소를 반환합니다. 0은 첫 번째 원소, -1은 마지막 원소를 의미합니다.
LINDEX:리스트의 지정된 인덱스에 있는 원소를 반환합니다.
//구문
LINDEX key index
//예제
LINDEX mylist 0
위 명령어는 mylist 리스트의 첫 번째 원소를 반환합니다.
LREM:리스트에서 지정된 값의 원소를 삭제합니다. count는 삭제할 원소의 개수를 지정합니다.
//구문
LREM key count element
//예제
LREM mylist 2 "hello"
위 명령어는 mylist 리스트에서 "hello" 값을 가진 원소를 2개까지 삭제합니다.
LSET:리스트의 지정된 인덱스에 원소를 설정합니다. 리스트가 존재하지 않거나 인덱스가 범위를 벗어나면 오류가 발생합니다.
//구문
LSET key index value
//예제
LSET mylist 0 "newvalue"
위 명령어는 mylist 리스트의 인덱스 0에 있는 원소를 "newvalue"로 설정합니다.
LTRIM:리스트를 지정된 범위로 잘라냅니다. 잘라낸 범위를 제외한 원소들은 삭제됩니다.
//구문
LTRIM key start stop
//예제
LTRIM mylist 0 1
위 명령어는 mylist 리스트의 인덱스 0부터 1까지의 원소만 남기고 나머지 원소를 삭제합니다.
4.Hashes
Redis의 Hash타입은 필드와 값의 쌍으로 구성된 데이터 구조를 제공합니다. 이 타입은 일반적으로 객체나 레코드와 같은 구조를 저장하는 데 유용합니다. Redis의 Hash는 간단한 키-값 쌍을 여러 개 포함할 수 있으며, 필드와 값을 쉽게 추가하고 업데이트하며 조회할 수 있습니다.
Redis Hash타입의 특징
- 필드와 값 쌍:
- Redis Hash는 하나의 키에 여러 필드와 값을 저장합니다. 각 필드는 고유하며, 그에 대응하는 값이 저장됩니다. 이 구조는 자주 사용하는 필드와 값을 저장하는 데 적합합니다.
- 메모리 효율성:
- Redis의 Hash는 많은 수의 필드와 값을 저장할 수 있으면서도 메모리 사용을 효율적으로 관리합니다. 내부적으로 매우 효율적인 구조로 구현되어 있어 많은 필드와 값을 가진 해시도 메모리 소모를 최소화할 수 있습니다.
- 부분 조회:
- 전체 해시가 아니라 특정 필드의 값만을 조회하거나 수정할 수 있습니다. 이는 필요한 데이터만을 효율적으로 처리할 수 있게 합니다.
명령어: HSET, HGET, HGETALL, HDEL, HEXISTS가 있습니다.
HSET:주어진 해시에 필드와 값을 설정합니다. 필드가 이미 존재하면 기존 값을 덮어씁니다.
//구문
HSET key field value
//예제
HSET user:1000 name "Alice"
HSET user:1000 age "30"
HGET:주어진 해시의 필드에 대한 값을 반환합니다. 필드가 존재하지 않으면 nil을 반환합니다.
//구문
HGET key field
//예제
HGET user:1000 name
HGETALL:주어진 해시의 모든 필드와 값을 반환합니다.
//구문
HGETALL key
//예제
HGETALL user:1000
HMSET:주어진 해시에 여러 필드와 값을 동시에 설정합니다. (Redis 4.0.0 이후 HMSET은 HSET으로 대체되었으며, 여러 필드를 동시에 설정할 때 HSET을 사용합니다.)
//구문
HMSET key field1 value1 field2 value2 [fieldN valueN ...]
//예제
HMSET user:1000 name "Alice" age "30" email "alice@example.com"
HDEL:주어진 해시에서 하나 이상의 필드를 삭제합니다. 필드가 존재하지 않으면 무시됩니다.
//구문
HDEL key field [field ...]
//예제
HDEL user:1000 age
HEXISTS:주어진 해시에서 필드가 존재하는지 여부를 확인합니다. 필드가 존재하면 1을, 존재하지 않으면 0을 반환합니다.
//구문
HEXISTS key field
//예제
HEXISTS user:1000 name
HLEN:주어진 해시의 필드 개수를 반환합니다.
//구문
HLEN key
//예제
HLEN user:1000
HKEYS:주어진 해시의 모든 필드를 반환합니다.
//구문
HKEYS key
//예제
HKEYS user:1000
HVALS:주어진 해시의 모든 값을 반환합니다.
//구문
HVALS key
//예제
HVALS user:1000
5.Sets
Redis의 Set 타입은 집합 자료구조를 제공하며, 중복된 값을 허용하지 않고, 원소가 순서에 관계없이 저장되는 특징이 있습니다. 집합은 기본적으로 유일한 원소를 가진 컬렉션을 표현할 때 유용합니다. Redis Set은 집합 연산을 지원하며, 집합 간의 교집합, 합집합, 차집합 등의 연산을 효율적으로 수행할 수 있습니다.
Redis Set의 특징
- 중복 원소 없음:
- Redis Set은 중복된 값을 허용하지 않습니다. 동일한 값을 여러 번 추가해도 집합에 한 번만 저장됩니다.
- 비순서적:
- Set은 원소의 순서를 유지하지 않으며, 저장된 원소는 정렬되지 않습니다.
- 집합 연산:
- Redis는 집합 간의 교집합, 합집합, 차집합을 계산할 수 있는 명령어를 제공합니다.
- 빠른 성능:
- 집합 원소에 대한 추가, 삭제, 검사 연산은 평균적으로 O(1)의 시간 복잡도로 수행됩니다.
Set의 명령어:SADD, SREM, SMEMBERS, SISMEMBER, SCARD, SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SUNION, SUNIONSTORE
SADD:집합에 하나 이상의 원소를 추가합니다. 원소가 이미 집합에 존재하면 무시됩니다.
//구문
SADD key member [member ...]
//예제
SADD myset "apple"
SADD myset "banana"
SADD myset "apple" // "apple"은 이미 존재하므로 무시됨
SREM:집합에서 하나 이상의 원소를 제거합니다. 원소가 집합에 존재하지 않으면 무시됩니다.
//구문
SREM key member [member ...]
//예제
SREM myset "banana"
SMEMBERS:집합의 모든 원소를 반환합니다.
//구문
SMEMBERS key
//예제
SMEMBERS myset
SISMEMBER:주어진 원소가 집합에 존재하는지 여부를 확인합니다. 존재하면 1, 존재하지 않으면 0을 반환합니다.
//구문
SISMEMBER key member
//예제
SISMEMBER myset "apple"
SCARD:집합의 원소 개수를 반환합니다.
//구문
SCARD key
//예제
SCARD myset
SDIFF:하나 이상의 집합의 차집합을 계산합니다. 결과는 첫 번째 집합에서 다른 집합들에 존재하지 않는 원소들입니다.
//구문
SDIFF key [key ...]
//예제
SDIFF set1 set2
SDIFFSTORE:SDIFF와 유사하지만, 결과를 지정된 키에 저장합니다.
//구문
SDIFFSTORE destination key [key ...]
//예제
SDIFFSTORE diffset set1 set2
SINTER:하나 이상의 집합의 교집합을 계산합니다. 결과는 모든 집합에 존재하는 원소들입니다.//.
//구문
SINTER key [key ...]
//예제
SINTER set1 set2
SINTERSTORE:SINTER와 유사하지만, 결과를 지정된 키에 저장합니다.
//구문
SINTERSTORE destination key [key ...]
//예제
SINTERSTORE interset set1 set2
SUNION:하나 이상의 집합의 합집합을 계산합니다. 결과는 모든 집합에 존재하는 원소들의 집합입니다.
//구문
SUNION key [key ...]
//예제
SUNION set1 set2
SUNIONSTORE:SUNION과 유사하지만, 결과를 지정된 키에 저장합니다.
//구문
SUNIONSTORE destination key [key ...]
//예제
SUNIONSTORE unionset set1 set2
6.Sorted sets
Sorted Sets은 타입은 정렬된 집합을 제공하는 자료구조입니다. Sorted Set은 집합의 원소를 점수(score)라는 값에 따라 정렬하여 저장하며, 중복된 원소를 허용하지 않습니다. 이 자료구조는 데이터의 순서가 중요할 때 유용하며, 점수에 기반한 정렬과 범위 검색이 가능합니다.
Sorted Sets의 특징
- 점수에 따른 정렬:
- Sorted Set의 각 원소는 점수(score)라는 실수 값과 연결되어 있으며, 이 점수를 기준으로 원소가 자동으로 정렬됩니다. 점수는 원소의 우선순위나 중요도를 나타낼 수 있습니다.
- 중복 원소 없음:
- Sorted Set은 중복된 원소를 허용하지 않습니다. 동일한 값의 원소를 추가하면, 기존 원소의 점수가 업데이트됩니다.
- 빠른 검색:
- Sorted Set은 점수에 따른 원소의 삽입, 삭제, 조회가 O(log N)의 시간 복잡도로 수행됩니다. 또한, 범위 검색 및 정렬된 원소의 서브셋을 쉽게 찾을 수 있습니다.
- 인덱스 기반 검색:
- 점수를 기준으로 범위 검색, 정렬된 목록의 서브셋 조회 등을 지원하여 인덱스 기반의 검색이 가능합니다.
명령어: ZADD, ZRANGE, ZREM, ZSCORE....
ZADD:Sorted Set에 하나 이상의 원소를 추가하거나 점수를 업데이트합니다.
//구문
ZADD key score member [score member ...]
//예제
ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"
ZADD leaderboard 150 "Charlie"
ZREM:Sorted Set에서 하나 이상의 원소를 제거합니다.
//구문
ZREM key member [member ...]
//예제
ZREM leaderboard "Charlie"
ZRANGE:점수가 가장 낮은 원소부터 높은 원소까지 범위 내의 원소를 반환합니다. 인덱스 기반으로 조회합니다.
//구문
ZRANGE key start stop [WITHSCORES]
//예제
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE:점수가 가장 높은 원소부터 낮은 원소까지 범위 내의 원소를 반환합니다. 인덱스 기반으로 조회합니다.
//구문
ZREVRANGE key start stop [WITHSCORES]
//예제
ZREVRANGE leaderboard 0 -1 WITHSCORES
ZRANK:Sorted Set에서 주어진 원소의 순위를 반환합니다. 점수가 낮은 원소부터 높은 원소까지 순서를 매깁니다.
//구문
ZRANK key member
//예제
ZRANK leaderboard "Bob"
ZREVRANK:Sorted Set에서 주어진 원소의 역순위를 반환합니다. 점수가 높은 원소부터 낮은 원소까지 순서를 매깁니다.
//구문
ZREVRANK key member
//예제
ZREVRANK leaderboard "Bob"
ZSCORE:Sorted Set에서 주어진 원소의 점수를 반환합니다.
//구문
ZSCORE key member
//예제
ZSCORE leaderboard "Alice"
ZCARD:Sorted Set의 원소 개수를 반환합니다.
//구문
ZCARD key
//예제
ZCARD leaderboard
ZCOUNT:점수 범위 내의 원소 개수를 반환합니다.
//구문
ZCOUNT key min max
예제
ZCOUNT leaderboard 100 200
ZRANGE:Sorted Set의 주어진 범위에 있는 원소를 반환합니다. 점수를 기준으로 범위 내의 원소를 조회합니다.
//구문
ZRANGE key start stop [WITHSCORES]
//예제
ZRANGE leaderboard 0 1 WITHSCORES
ZREVRANGE:Sorted Set의 주어진 범위에 있는 원소를 역순으로 반환합니다. 점수를 기준으로 범위 내의 원소를 조회합니다.
//구문
ZREVRANGE key start stop [WITHSCORES]
//예제
ZREVRANGE leaderboard 0 1 WITHSCORES