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를 제거합니다.