Redis
Redis는 REmote DIctionay Server의 줄임말로, Java의 Map과 같은 방식으로 데이터를 저장하는 데이터베이스.
일반적인 관계형 데이터베이스와 다른 가장 큰 특징은 In-Memory 데이터베이스라는 점.
Redis는 메모리, 즉 RAM에 데이터를 저장하기 때문에, 복잡한 입출력 과정이 필요하지 않다. 그래서 일반적인 관계형 데이터베이스에 비해 더 빠르게 동작하는 대신, 언제든 사라질 수 있는 데이터를 다룬다는 차이를 가진다.
사용 예시 > 특정 게시글의 조회수와 같이 빠르게 업데이트 되는 데이터, 사용자 세션, 장바구니와 같이 시간이 지나면 삭제되는 데이터 등
NoSQL
관계형 데이터베이스는 일반적으로 테이블 형식으로 데이터를 저장하고, 그 데이터를 회수하기 위해 SQL을 사용한다.
반면 Redis는 단순 문자열(String)부터, 리스트, 집합, Hash 등 다양한 형태의 데이터를 저장하며, 이 데이터를 회수하기 위해 SQL을 사용하지 않는다. Redis는 대표적인 NoSQL 데이터베이스.
NoSQL 데이터베이스의 데이터 관리법
- Key-Value : 가장 단순한 형태의 데이터베이스로, Key에 Value를 저장하는 형태. JSON, Python의 Dictionary, Java의 Map의 형태
- Document : 객체를 표현하는 Document라는 단위로 데이터를 저장하는 형태. JSON, XML 등 복잡한 데이터를 저장하고 관리.
- Column-Family : 각 Row의 Column 이 고정되어 있지 않고, 필요한 데이터 칼럼을 이름, 데이터, timestamp와 함께 저장하는 형태.
Redis 자료형과 문법
String
가장 기본적인 자료형. Java의 Map<String, String>과 같이 동작.
SET user:email alex@example.com
GET user:email
- SET <key> <value> : key에 value 문자열 데이터를 저장. "으로 공백 구분
- GET <key> : key에 저장된 문자열 반환
만약 저장된 데이터가 정수라면 증감이 가능하다.
SET user:count 1
INCR user:count
DECR user:count
- INCR key : key에 저장된 데이터를 1 증가
- DECR key : Key에 저장된 데이터를 1 감소
여러 Key-Value를 한번에 다룰 땐 MSET, MGET 활용
MSET user:name alex user:email alex@example.com
MGET user:name user:email
- MSET key value [key value ... ] : key value의 형태로 주어진 인자들을 각 key에 value 저장
- MGET key [key] : 주어진 모든 Key에 해당하는 데이터 반환
단순 문자열이지만 곧 바이트 배열을 뜻하기 때문에 이미지, 음성, 영상, 파일, 또는 이메일 본문 등도 보관이 가능하다.
따라서 분산된 구조에서 비교적 큰 사이즈의 데이터를 주고 받아야 하는 상황에 key만 전달해서 데이터는 여기있다 전달하는 방식으로 활용 가능하다.
List
여러 문자열 데이터를 Linked List의 형태로 보관하는 자료형. Linked List이기 때문에, 중간의 데이터보다는 양 끝의 데이터, 즉 스택 또는 큐처럼 사용할 수 있다.
PUSH 또는 POP을 L 또는 R과 조합하여 왼쪽/오른쪽에 데이터를 추가/삭제 할 수 있다.
LPUSH user:list alex # [alex]
LPUSH user:list brad # [brad, alex]
RPUSH user:list chad # [brad, alex, chad]
RPUSH user:list dave # [brad, alex, chad, dave]
LPOP user:list # brad
RPOP user:list # chad
- LPUSH key value : key에 저장된 리스트의 앞쪽에 value 저장
- RPUSH key value : key에 저장된 리스트의 뒤쪽에 value 저장
- LPOP key : key에 저장된 리스트의 앞쪽에서 값을 반환 및 제거
- RPOP key : key에 저장된 리스트의 뒤쪽에서 값을 반환 및 제거
LLEN user:list
LRANGE user:list 0 3
LRANGE user:list 0 -1
- LLEN key : key에 저장된 리스트의 길이 반환
- LRANGE key start end : key의 start부터 end까지 원소들 반환
LLEN은 없는 Key를 대상으로 하면 0이 되지만, 다른 자료형을 저장한 Key를 대상으로 하면 오류 발생
LRANGE의 경우 시작을 0으로 생각하고, end가 실제 길이를 벗어나도 오류가 발생하지 않음. start > end 일 경우 빈 결과가 반환됨. 음수의 경우 리스트의 뒤에서부터 데이터를 가져옴.
SET
문자열의 집합. 집합인만큼 중복값을 제거하며, 순서가 존재하지 않음.
SADD user:java alex # [alex]
SADD user:java brad # [alex, brad]
SADD user:java chad # [alex, brad, chad]
SREM user:java alex # [brad, chad]
SMEMBERS user:java # [alex, brad, chad]
SISMEMBER user:java brad # true
SISMEMBER user:java dave # false
- SADD key value : key에 저장된 집합에 value 추가
- SREM key value : key에 저장된 집합에 value 제거
- SMEMBERS key : key에 저장된 집합의 모든 원소 반환
- SISMEMBER key value : key에 저장된 집합에 value가 존재하는지 반환
- SCARD key : key에 저장된 집합의 크기 반환
# 다른 Set에 추가한 뒤,
SADD user:python alex
SADD user:python dave
SINTER user:java user:python # [alex]
SUNION user:java user:python # [alex, brad, chad, dave]
SINTERCARD 2 user:java user:python # 1
- SINTER key1 key2 : key1과 key2에 저장된 집합들의 교집합의 원소들 반환
- SUNION key1 key2 : key1과 key2에 저장된 집합들의 합집합과 원소들 반환
- SINTERCARD number key1 [key2...] : number개의 key에 저장된 집합들의 교집합의 크기 반환
Hash
field-value 쌍으로 이루어진 자료형. Hash 데이터를 가져오기 위해 key를 사용하고, 이후 다시 key에 저장된 hash 데이터에 field-value 쌍을 넣어주는 형식으로 동작된다.
HSET user:alex name alex age 25
HSET user:alex major CSE
HGET user:alex name
HGET user:alex age
HMGET user:alex age major
HGETALL user:alex
HKEYS user:alex
HLEN user:alex
- HSET key field value [field value] : key에 해당하는 Hash의 field에 value를 넣는다. 한번에 여러 field-value 쌍을 넣어줄 수 있다.
- HGET jey field : key에 해당하는 Hash의 field 값(value) 반환. 없는 field의 경우 null.
- HMGET key field [field] : key에 저장된 Hash에서 복수의 field에 저장된 value를 반환.
- HGETALL key: key에 저장된 Hash에 저장된 field - value를 전부 반환.
- HKEYS key: key에 저장된 Hash에 저장된 field를 전부 반환
- HLEN key: key에 저장된 Hash에 저장된 field의 갯수를 반환
Hash는 본래 하나의 키에 복잡한 데이터 (객체 etc.)를 하나의 키에 저장하는 용도로 주로 활용되고, 공식 문서에서도 여러 Key에 걸쳐 객체의 데이터를 표현하기 보단 Hash를 자주 활용할 것을 권장.
예시로 장바구니 같은 기능은 사용자별로, 어떤 물품이 몇개나 담겨있는지와 같은 정보가 포함되어야 함. 사용자 마다 Hash 데이터를 생성하고, 물품 - 갯수 형식으로 데이터를 저장하면 사용자별 장바구니를 쉽게 저장할 수 있다.
Sorted Set
정렬된 집합. 기본적으로 SET과 동일하게, 유일한 값들만 유지하지만 여기에 더해 각 값들에 score라고하는 실수를 함께 보관한다. 데이터를 가져올 때 score를 바탕으로 정렬하여 가져올 수 있다.
ZADD user:ranks 10 alex
ZADD user:ranks 9 brad 11 chad
ZADD user:ranks 8 dave
ZINCRBY user:ranks 2 alex
ZRANK user:ranks alex
ZRANGE user:ranks 0 3
ZREVRANK user:ranks alex
ZREVRANGE user:ranks 0 3
- ZADD key score member [score member ...]: key의 Sorted Set에 score를 점수로 가진 member를 추가, 이미 있는 member의 경우 새로운 score를 설정
- ZRANK key member: key의 Sorted Set의 member의 순위를 오름차순 기준으로 0에서 부터 세서 반환
- ZRANGE key start stop: key의 Sorted Set의 member들을 start 부터 stop 순위까지 오름차순 기준으로 반환
- ZREVRANK key member: key의 Sorted Set의 member의 순위를 내림차순 기준으로 0에서 부터 세서 반환
- ZREVRANGE key start stop: key의 Sorted Set의 member들을 start 부터 stop 순위까지 내림차순 기준으로 반환
- ZINCRBY key increment member: key의 Sorted Set의 member의 score를 increment 만큼 증가 (음수를 전달하면 감소)
예시 > 대표적으로 리더보드나 Rate Limiter, 즉 순위와 관련된 기능을 만드는데 사용된다.
그 외 공용 명령어.
자료형과 상관없이 사용할 수 있다.
SET somekey "to be deleted"
DEL somekey
SET expirekey "to be expired"
EXPIRE expirekey 5
EXPIRETIME expirekey
- DEL key: key(와 저장된 데이터)를 제거
- EXPIRE key seconds: key의 TTL(유효시각)을 seconds로 설정, seconds초가 지나면 key 제거
- EXPIRETIME key: key가 만료되는 시각을 Unix Timestamp로 반환
'DevOps' 카테고리의 다른 글
[✉️ Kafka] Kafka 이해하기2 - Zookeper, Broker, Message (2) | 2024.09.27 |
---|---|
[✉️ Kafka] Kafka 이해하기1 - Producer, Consumer, Topic, Partition (0) | 2024.09.27 |
Docker로 pgAdmin 띄워서 PostgreSQL 손쉽게 활용하기 (1) | 2024.09.25 |
Dockerfile & Docker Compose 사용하기 (0) | 2024.08.20 |
CI/CD와 Docker 이해하기 (0) | 2024.08.17 |