본문 바로가기
Database/Redis

Redis 기본

by dvid 2022. 12. 25.

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

참고

댓글