Redis란?
정의
- Remote Dictionary Server
- Storage: 데이터 저장소 (데이터)
- Database: 전통적인 DBMS (영속성)
- Middleware: 어플리케이션이 Redis를 이용한다.
In-memory DB
- 데이터를 디스크가 아닌 RAM에 저장한다.
- 빠른 속도.
빠른 속도와 휘발성의 트레이드 오프를 고려해야 한다.
캐싱, 세션 등
Key-Value 저장소
- Java의
Map
과 같은 형식
- Hash를 이용하기 때문에 빠르다.
- 범위 검색 불가.
Redis 자료구조
String
- 바이트 배열 저장 (바이너리로 변환할 수 있는 모든 데이터를 저장 가능)
- 최대 크기는 512MB
127.0.0.1:6379> SET HELLO WORLD
OK
127.0.0.1:6379> GET HELLO
"WORLD"
명령어 |
기능 |
SET |
특정 키에 문자열 값 저장 |
GET |
특정 키의 문자열 값을 얻어온다. |
INCR |
특정 키의 값을 1 증가 |
DECR |
특정 키의 값을 1 감소 |
MSET |
여러 키의 값을 한번에 저장 |
MGET |
여러 키에 대한 값을 한 번에 얻어온다 |
List
- 키에 대한 값을 List로 관리한다.
LinkedList
형태의 자료구조
Queue
, Stack
으로 사용 가능
명령어 |
기능 |
LPUSH |
리스트 왼쪽(head)에 값 추가 |
RPUSH |
리스트 오른쪽(tail)에 값 추가 |
LLEN |
리스트에 들어있는 요소 개수 반환 |
LRANGE |
리스트 특정 범위 반환 (zero base) |
LPOP |
리스트 왼쪽(head)에서 값을 반환 후 삭제 |
RPOP |
리스트의 오른쪽(tail)에서 값을 반환 후 삭제 |
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> rpush list 0
(integer) 3
127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> lrange list 0 2
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> lpop list
"2"
Set
- 순서가 없는 단일 값의 집합
- 검색이 빠르다.
- 집합 연산이 가능
명령어 |
기능 |
SADD |
Set에 데이터 추가 |
SREM |
Set에 데이터 삭제 |
SCARD |
Set에 저장된 아이템 개수 반환 |
SMEMBERS |
Set에 저장된 아이템 반환 |
SISMEMBER |
특정 값이 Set에 포함되어 1(있음) / 0(없음) 반환 |
127.0.0.1:6379> sadd set 1
(integer) 1
127.0.0.1:6379> sadd set 2
(integer) 1
127.0.0.1:6379> scard set
(integer) 2
127.0.0.1:6379> smembers set
1) "1"
2) "2"
127.0.0.1:6379> sismember set 1
(integer) 1
127.0.0.1:6379> sismember set 3
(integer) 0
127.0.0.1:6379> sismember set 2
(integer) 1
127.0.0.1:6379> srem set 2
(integer) 1
127.0.0.1:6379> smembers set
1) "1"
Hashes
- 하나의 키 하위에 여러개의 field-value 쌍 저장
- 여러 필드를 가진 객체를 저장한다고 볼 수 있다.
명령어 |
기능 |
HKEYS |
키에 저장된 필드를 반환 |
HSET |
한 개 또는 다수의 필드에 값을 저장 |
HGET |
특정 필드의 값을 반환 |
HMGET |
한 개 이상의 필드 값을 반환 |
HINCRBY |
특정 필드의 값을 지정한 값 만큼 증가 (integer일 경우) |
HDEL |
한 개 이상의 필드 삭제 |
127.0.0.1:6379> hset key hashkey1 value1 hashkey2 value2
(integer) 2
127.0.0.1:6379> hget key hashkey1
"value1"
127.0.0.1:6379> hset key intkey 1
(integer) 1
127.0.0.1:6379> hmget key hashkey1 hashkey2
1) "value1"
2) "value2"
127.0.0.1:6379> hincrby key intkey 1
(integer) 2
127.0.0.1:6379> hincrby key intkey 2
(integer) 4
127.0.0.1:6379> hdel key hashkey2
(integer) 1
127.0.0.1:6379> hkeys key
1) "hashkey1"
2) "intkey"
Sorted Sets
- 각 값은 socre를 기준으로 정렬되어 있음
- 순위계산 / 리더보드 등에 사용됨
명령어 |
기능 |
ZADD |
한 개 또는 다수의 값을 추가 또는 업데이트 |
ZRANGE |
특정 범위의 값을 반환 |
ZRANK |
특정 값의 순위 반환 (오름차순) |
ZREVRANK |
특정 값의 순위 반환 (내림차순) |
ZREM |
한 개 이상의 값 삭제 |
127.0.0.1:6379> zadd rank 1 rank1 2 rank2
(integer) 2
127.0.0.1:6379> zrange rank 0 1
1) "rank1"
2) "rank2"
127.0.0.1:6379> zrank rank rank1
(integer) 0
127.0.0.1:6379> zrevrank rank rank1
(integer) 1
127.0.0.1:6379> zrem rank rank1
(integer) 1
127.0.0.1:6379> zrange rank 0 1
1) "rank2"
명령어 |
기능 |
PFADD |
HyperLogLog에 값 추가 |
PFCOUNT |
HyperLogLog에 입력된 유니크 값의 개수 반환 |
PFMERGE |
다수의 HyperLogLog를 병합 |
Bitmaps
- 비트 벡터를 사용해 N개의 Set을 공간 효율적으로 저장
- 하나의 비트맵이 가지는 공간은 232 - 1
- 비트 연산 가능
명령어 |
기능 |
SETBIT |
비트맵의 특정 오프셋에 값을 변경 |
GETBIT |
비트맵의 특정 오프셋의 값을 반환 |
BITCOUNT |
비트맵에서 1인 상태의 비트의 개수를 반환 |
BITOP |
비트맵들 간의 비트연산을 수행 후 결과를 비트맵에 저장 |
127.0.0.1:6379> clear
127.0.0.1:6379> setbit key 0 1
(integer) 0
127.0.0.1:6379> setbit key 5 1
(integer) 0
127.0.0.1:6379> set bit key 8 0
(error) ERR syntax error
127.0.0.1:6379> setbit key 8 0
(integer) 0
127.0.0.1:6379> setbit key 10 1
(integer) 0
127.0.0.1:6379> getbit key 10
(integer) 1
127.0.0.1:6379> bitcount key
(integer) 3
127.0.0.1:6379> setbit key2 0 1
(integer) 0
127.0.0.1:6379> setbit key2 5 1
(integer) 0
127.0.0.1:6379> bitop and key3 key key2
(integer) 2
127.0.0.1:6379> bitcount key3
(integer) 2
HyperLogLog
- 유니크한 값의 개수를 효율적으로 얻을 수 있다.
- 오차가 있고, 매우 큰 데이터를 다룰 때 사용
- 264개의 유니크 값을 계산 가능
- 최대 12KB 메모리 사용. 0.81% 오차
127.0.0.1:6379> pfadd today kim lee park
(integer) 1
127.0.0.1:6379> pfcount today
(integer) 3
127.0.0.1:6379> pfadd today kim
(integer) 0
127.0.0.1:6379> pfcount today
(integer) 3
127.0.0.1:6379> pfadd tommorrow kim park
(integer) 1
127.0.0.1:6379> pfcount tommorrow
(integer) 2
127.0.0.1:6379> pfmerge today tommorrow
OK
127.0.0.1:6379> pfcount today
(integer) 3
127.0.0.1:6379> pfadd tommorrow choi
(integer) 1
127.0.0.1:6379> pfmerge today tommorrow
OK
127.0.0.1:6379> pfcount today
(integer) 4
참고
댓글