[Redis] : Redis의 data type과 간단한 명령어

Redis는 기본적으로 Key-Value 데이터베이스 입니다. 따라서, 대부분의 명령이 Key를 바탕으로 동작하고, Value로 사용하고자 하는 자료형에 따라 다른 명령어를 사용하게 됩니다. 

String

String

  • 가장 기본적인 자료형
  • Java의 `Map<String, String>`처럼 동작
  • 저장할 수 있는 최대 크기는 512MB

SET, GET

SET user:email alex@example.com
GET user:email
  • `SET <key> <value>` : key에 value 문자열 데이터를 저장합니다.
  • `GET <key>` : key에 저장된 문자열을 반환합니다.

INCR, DECR

만약, 저장된 데이터가 정수 데이터라면 증가, 감소가 가능합니다.

SET user:count 1
INCR user:count
DECR user:count
  • `INCR key` : key에 저장된 데이터를 1 증가
  • `DECR key` : key에 저장된 데이터를 1 감소

MSET, MGET

여러 key-value를 한 번에 다루고 싶을 때 사용할 수 있습니다.

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에 해당하는 데이터를 반환합니다.

List

List는

  • 여러 문자열 데이터Linked List의 형태로 보관하는 자료형
  • Linked List 형태를 취하기 때문에, 양끝의 데이터 즉, 스택 또는 처럼 사용할 수 있습니다.
  • `PUSH` 또는 `POP`을 `L` 또는 `R`과 조합하여, 왼쪽 또는 오른쪽에 데이터를 추가/삭제할 수 있습니다.

LPUSH, RPUSH, LPOP, RPOP

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에 저장된 리스트의 뒤쪽에서 값을 반환 및 제거합니다.

Redis는 Key-Value 형태로 저장하기 때문에, List의 경우 `Map<String, List<String>>`과 같은 형태로 사용됩니다.

LLEN, LRANGE

LLEN user:list
LRANGE user:list 0 3
LRANGE user:list 0 -1
  • `LLEN key` : key에 저장된 리스트의 길이를 반환합니다.
    • 없는 key를 대상으로 하면 0이 되지만, 다른 자료형을 저장한 key를 대상으로 하면 오류가 발생합니다.
  • `LRANGE key start end` : key의 start부터 end까지 원소들을 반환합니다.
    • `start`의 시작 : 0
    • `end`가 실제 길이를 벗어나더라도 오류가 발생하진 않습니다.
    • `start` > `end`일 경우, 빈 결과가 반환됩니다.
    • 음수의 경우, 리스트의 뒤에서부터 데이터를 가져옵니다.

Set

Set

  • 문자열의 집합
  • 중복값을 제거합니다.
  • 순서가 존재하지 않습니다.

SADD, SREM, SMEMBERS, SISMEMBERS, SCARD

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가 존재하는지 반환합니다.
    • $O(1)$의 시간복잡도를 가집니다.
    • 중복 없는 방문 수, 인증 토큰 블랙리스트 등을 구현할 때 활용할 수 있습니다.
  • `SCARD key` : key에 저장된 집합의 크기를 반환합니다.

만약 여러 집합이 존재하는 경우, 교집합, 합집합 등의 기능을 제공합니다.

SINTER, SUNION, SINTERCARD

# 다른 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

Hash

  • Field-Value 쌍으로 이뤄진 자료형
  • Hash 데이터를 가져오기 위해 Key를 사용하고, 이루 다시 Key에 저장된 Hash 데이터에 Field-Value 쌍을 넣어주는 방식으로 동작합니다.
  • Redis 전체가 `Map`이라면, Hash는 `Map<String, Hash<String, String>>`의 형식이 됩니다.

HSET, HGET, HMGET, HGETALL, HKEYS, HLEN

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
  • `SET key field value [field value]` : key의 Hash에 field에 value를 넣습니다.
    • 한번에 여러 field - value 쌍을 넣어줄 수 있습니다.
  • `HGET key 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의 개수를 반환합니다.

예를 들어, 장바구니 같은 기능은 사용자별(Key)로, 어떤 물품(Filed)이 몇개(Value)나 담겨있는지와 같은 정보가 필요합니다. 이때, 사용자 마다 Hash 데이터를 생성하고, 물품-개수 형식으로 데이터를 저장하는 방식으로 사용할 수 있습니다.

Sorted Set

Sorted Set

  • 정렬된 집합
  • Set과 동일하게 유일한 값들을 유지하지만, `score`라는 실수를 함께 보관합니다.
  • 데이터를 가져올 때, `score`를 바탕으로 정렬하여 값들을 가져올 수 있습니다.

ZADD, ZINCRBY, ZRANK, ZRANGE, ZREVRANK, ZREVRANGE

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 만큼 증가시킵니다.
    • 음수를 전달하면 감소시킵니다.

Sorted Set은 주로 리더보드, Rate Limiter와 같이 순위와 관련된 기능을 만드는데 사용됩니다.

 

그 외의 공용 명령어

위의 명령어 외에도 자료형과 상관없이 사용할 수 있는 명령들이 있습니다. 이 중 대표적으로 많이 사용하는 것에는 다음과 같은 것들이 있습니다.

DEL

SET somekey "to be deleted"
DEL somekey
  • `DEL key` : key(와 저장된 데이터)를 제거합니다.

EXPIRE, EXPIRETIME

SET expirekey "to be expired"
EXPIRE expirekey 5
EXPIRETIME expirekey
  • `EXPIRE key seconds` : key의 TTL(유효시각)을 seconds로 설정합니다.
    • seconds초가 지나면 key가 제거됩니다.
  • `EXPIRETIME key` : key가 만료되는 시각을 Unix Timestamp로 반환합니다.

KEYS

KEYS *
  • `KEYS [pattern]` : 패턴에 맞는 저장된 Key들를 반환합니다.
    • glob 패턴 형식을 전달합니다. 
    • `*` : 모든 Key와 일치하는 패턴입니다.

FLUSHDB

FLUSHDB
  • 모든 Key를 제거합니다.