Published on

[Redis] Redis Data Types

Authors
  • avatar
    Name
    유사공대생
    Twitter

Strings

  • 가장 기본적인 데이터 타입으로 제일 많이 사용됨
  • 바이트 배열을 저장(binary-safe: 모든 문자를 표시할 수 있음)
  • 바이너리로 변환할 수 있는 모든 데이터를 저장 가능(jpg와 같은 파일 등)
  • 최대 크기는 512MB

Strings 주요 명령어

명령어기능예제
SET특정 키에 문자열을 저장한다.SET say hello
GET특정 키의 문자열 값을 얻어온다.GET say
INCR특정 키의 값을 Integer로 취급하여 1 증가시킨다.INCR mycount
DECR특정 키의 값을 Integer로 취급하여 1 감소시킨다.DECR mycount
MSET여러 키에 대한 값을 한번에 저장한다.MSET mine milk yours coffee
MGET여러 키에 대한 값을 한번에 얻어온다.MGET mine yours

아래와 같이 적용되게 된다.

# Redis 터미널에서 실행할 명령어
127.0.0.1:6379> SET say hello
OK
127.0.0.1:6379> GET say
"hello"
127.0.0.1:6379> INCR mycount
(integer) 1
127.0.0.1:6379> DECR mycount
(integer) 0
# MSET과 MGET의 경우는 [key] [value] 형식으로 작성하면 된다.
127.0.0.1:6379> MSET mine milk yours coffee
OK
127.0.0.1:6379> MGET mine yours
1) "milk"
2) "coffee"

Lists

  • Linked-list 형태의 자료구조(인덱스 접근은 느리지만 데이터 추가/삭제가 빠름)
  • Queue와 Stack으로 사용할 수 있음

List 주요 명령어

명령어기능예제
LPUSH리스트의 왼쪽(head)에 요소 추가LPUSH mylist value1
RPUSH리스트의 오른쪽(tail)에 요소 추가RPUSH mylist value2
LPOP리스트의 왼쪽(head)에서 요소 제거하고 반환LPOP mylist
RPOP리스트의 오른쪽(tail)에서 요소 제거하고 반환RPOP mylist
LLEN리스트의 길이를 반환LLEN mylist
LRANGE리스트의 범위에 해당하는 요소들 반환LRANGE mylist 0 -1
LINDEX리스트에서 해당 인덱스의 요소 반환LINDEX mylist 0
LINSERT리스트에서 주어진 위치에 요소 삽입LINSERT mylist BEFORE value1 value_new
LREM리스트에서 특정 값의 요소 제거LREM mylist 2 value2
# Redis 터미널에서 실행할 명령어 및 결과
127.0.0.1:6379> LPUSH mylist value1
(integer) 1
127.0.0.1:6379> RPUSH mylist value2
(integer) 2
127.0.0.1:6379> LPOP mylist
"value1"
127.0.0.1:6379> RPOP mylist
"value2"
127.0.0.1:6379> LPUSH mylist value3
(integer) 1
127.0.0.1:6379> LPUSH mylist value4
(integer) 2
127.0.0.1:6379> LLEN mylist
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "value4"
2) "value3"
127.0.0.1:6379> LINDEX mylist 0
"value4"
127.0.0.1:6379> LINSERT mylist BEFORE value3 value_new
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "value4"
2) "value_new"
3) "value3"
127.0.0.1:6379> LREM mylist 1 value_new
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 -1
1) "value4"
2) "value3"

Sets

  • 순서가 없는 유니크한 값의 집합
  • 검색이 빠름
  • 개별 접근을 위한 인덱스가 존재하지 않고, 집합 연산이 가능(교집합, 합집합 등)

주요 명령어

명령어기능예제
SADD집합에 멤버 추가SADD myset member1
SMEMBERS집합의 모든 멤버들을 반환SMEMBERS myset
SISMEMBER멤버가 집합에 있는지 확인SISMEMBER myset member1
SCARD집합의 멤버 수 반환SCARD myset
SREM집합에서 멤버 삭제SREM myset member2
SUNION여러 집합을 합쳐서 반환SUNION set1 set2
SDIFF두 집합의 차집합 반환SDIFF set1 set2
SINTER여러 집합의 교집합 반환SINTER set1 set2
# Redis 터미널에서 실행할 명령어 및 결과
127.0.0.1:6379> SADD myset member1
(integer) 1
127.0.0.1:6379> SADD myset member2
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "member1"
2) "member2"
127.0.0.1:6379> SISMEMBER myset member1
(integer) 1
127.0.0.1:6379> SCARD myset
(integer) 2
127.0.0.1:6379> SREM myset member2
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "member1"
127.0.0.1:6379> SADD myset2 member2
(integer) 1
127.0.0.1:6379> SUNION myset myset2
1) "member1"
2) "member2"
127.0.0.1:6379> SADD myset3 member1
(integer) 1
127.0.0.1:6379> SINTER myset myset3
1) "member1"
127.0.0.1:6379> SADD myset4 member3
(integer) 1
127.0.0.1:6379> SDIFF myset myset4
1) "member1"

Hashes

  • 하나의 key 하위에 여러개의 field-value 쌍을 저장
  • 여러 필드를 가진 객체를 저장하는 것으로 생각할 수 있음
  • HINCRBY 명령어를 사용해 카운터로 활용 가능

주요 명령어

명령어기능예제
HSET해시에 필드와 값 추가HSET myhash field1 value1
HGET해시에서 특정 필드의 값을 가져오기HGET myhash field1
HGETALL해시의 모든 필드와 값을 가져오기HGETALL myhash
HDEL해시에서 특정 필드 삭제HDEL myhash field1
HEXISTS해시에 특정 필드가 존재하는지 확인HEXISTS myhash field1
HKEYS해시의 모든 필드 가져오기HKEYS myhash
HVALS해시의 모든 값을 가져오기HVALS myhash
HLEN해시의 필드 수 반환HLEN myhash
HMSET여러 필드와 값을 한번에 설정HMSET myhash field1 value1 field2 value2
HMGET여러 필드의 값을 한번에 가져오기HMGET myhash field1 field2
HINCRBY특정 필드의 값을 Integer로 취급하여 지정한 숫자를 증가시킨다.HINCRYBY user1 viewcount 1
# Redis 터미널에서 실행할 명령어 및 결과
127.0.0.1:6379> HSET myhash field1 value1
(integer) 1
127.0.0.1:6379> HSET myhash field2 value2
(integer) 1
127.0.0.1:6379> HGET myhash field1
"value1"
127.0.0.1:6379> HGETALL myhash
1) "field1"
2) "value1"
3) "field2"
4) "value2"
127.0.0.1:6379> HDEL myhash field2
(integer) 1
127.0.0.1:6379> HEXISTS myhash field2
(integer) 0
127.0.0.1:6379> HKEYS myhash
1) "field1"
127.0.0.1:6379> HVALS myhash
1) "value1"
127.0.0.1:6379> HLEN myhash
(integer) 1
127.0.0.1:6379> HMSET myhash field2 value2 field3 value3
OK
127.0.0.1:6379> HMGET myhash field1 field2
1) "value1"
2) "value2"

SortedSets

  • Set과 유사하게 유니크한 값의 집합
  • 각 값은 연관된 score를 가지로 정렬되어 있음
  • 정렬된 상태이기에 빠르게 최소/최대 값을 구할 수 있음
  • 순위 계산, 리더보드 구현 등에 활용

주요 명령어

명령어기능예제
ZADD정렬된 집합에 멤버와 점수 추가ZADD myset 1 member1
ZRANGE정렬된 집합에서 범위에 있는 멤버 반환ZRANGE myset 0 -1 WITHSCORES
ZSCORE정렬된 집합에서 멤버의 점수 반환ZSCORE myset member1
ZREM정렬된 집합에서 멤버 제거ZREM myset member1
ZCARD정렬된 집합의 멤버 수 반환ZCARD myset
ZCOUNT정렬된 집합에서 점수 범위 내 멤버 수 반환ZCOUNT myset 0 5
ZRANK정렬된 집합에서 멤버의 순위 반환ZRANK myset member1
ZREVRANGE정렬된 집합에서 역순 범위에 있는 멤버 반환ZREVRANGE myset 0 -1 WITHSCORES
ZINCRBY정렬된 집합에서 멤버의 점수 증가ZINCRBY myset 1 member1
# Redis 터미널에서 실행할 명령어 및 결과
127.0.0.1:6379> ZADD myset 1 member1
(integer) 1
127.0.0.1:6379> ZADD myset 2 member2
(integer) 1
127.0.0.1:6379> ZRANGE myset 0 -1 WITHSCORES
1) "member1"
2) "1"
3) "member2"
4) "2"
127.0.0.1:6379> ZSCORE myset member1
"1"
127.0.0.1:6379> ZREM myset member2
(integer) 1
127.0.0.1:6379> ZCARD myset
(integer) 1
127.0.0.1:6379> ZCOUNT myset 0 5
(integer) 1
127.0.0.1:6379> ZRANK myset member1
(integer) 0
127.0.0.1:6379> ZREVRANGE myset 0 -1 WITHSCORES
1) "member1"
2) "1"
127.0.0.1:6379> ZINCRBY myset 5 member1
"6"

Bitmaps

  • 비트 벡터를 사용해 N개의 Set을 공간 효율적으로 저장
  • 하나의 비트맵이 가지는 공간은 4,294,967,295(2^32 -1)
  • 비트 연산 가능

주요 명령어

명령어기능예제
SETBIT비트맵에서 특정 오프셋의 비트 설정SETBIT mybitmap 0 1
GETBIT비트맵에서 특정 오프셋의 비트 값 반환GETBIT mybitmap 0
BITCOUNT비트맵에서 설정된 비트의 수 반환BITCOUNT mybitmap
BITOP비트맵들 간의 비트 연산BITOP AND destbitmap mybitmap1 mybitmap2
BITPOS비트맵에서 첫 번째로 나타나는 비트 위치 반환BITPOS mybitmap 1
# Redis 터미널에서 실행할 명령어 및 결과
127.0.0.1:6379> SETBIT mybitmap 0 1
(integer) 0
127.0.0.1:6379> GETBIT mybitmap 0
(integer) 1
127.0.0.1:6379> BITCOUNT mybitmap
(integer) 1
127.0.0.1:6379> SETBIT mybitmap2 1 1
(integer) 0
127.0.0.1:6379> BITOP AND destbitmap mybitmap mybitmap2
(integer) 1
127.0.0.1:6379> GETBIT destbitmap 1
(integer) 1
127.0.0.1:6379> BITPOS mybitmap 1
(integer) 0

HyperLogLog

  • 유니크한 값의 개수를 효율적으로 얻을 수 있음
  • 확률적 자료구조로서 오차가 있으며, 매우 큰 데이터를 다룰 때 사용
  • 18,466,744,709,551,616(2^64)개의 유니크한 값을 계산 가능
  • 12KB까지 메모리를 사용하며 0.81%의 오차율을 허용

주요 명령어

명령어기능예제
PFADDHyperLogLog에 하나 이상의 요소 추가PFADD myloglog element1 element2
PFCOUNTHyperLogLog의 추정된 카디널리티(요소 수) 반환PFCOUNT myloglog
PFMERGE여러 HyperLogLog를 하나로 병합PFMERGE destloglog myloglog1 myloglog2

Redis 터미널에서 실행할 명령어 및 결과

127.0.0.1:6379> PFADD myloglog element1 element2
(integer) 1
127.0.0.1:6379> PFCOUNT myloglog
(integer) 2
127.0.0.1:6379> PFADD myloglog2 element2 element3
(integer) 1
127.0.0.1:6379> PFMERGE destloglog myloglog myloglog2
OK
127.0.0.1:6379> PFCOUNT destloglog
(integer) 3