반응형

들어가며

Redis에서 지원하는 데이터 타입

  • (Binary-safe) Strings

  • Lists: 삽입 순서에 따라 정렬된 문자열의 집합. 기본적인 linked list 형태

  • Sets: 고유하고 정렬되지 않은 문자열의 집합

  • Sorted Sets: Sets와 비슷하지만 모든 값은 스코어로 정렬됨

    • Sets와 달리 다양한 방법으로 활용 가능 (ex. 상위10개의 값, 하위 10개의 값)
  • Hashes: value와 연관된 필드로 구성된 맵. 모든 필드와 값은 모두 문자열로 구성

  • Bit arrays (Bitmaps)

  • HyperLogLogs: 집합의 카디널리티를 추정하기 위해 사용되는 확률적 데이터 구조.

  • Streams: 추상 로그 데이터 유형을 제공하는 append-only 자료구조

Redis Keys

  • "ABC" 같은 문자열 뿐만 아니라 JPEG같은 파일 같은 이진 시퀀스는 모두 키로 사용 가능함 (Binary Safe)
  • 허용되는 최대 크기는 512MB

String

데이터 추가, 조회

127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> GET a
"Hello World"

atomic하게 데이터 변경

  • atomic
    • 여러 클라이언트가 경쟁 상태(Race Condition)을 발생시킬 일이 없음
    • 클라이언트 A가 와 B가 동시에 10을 읽고 값을 동시에 11로 증가시켜 저장하는 상황은 발생하지 않음
127.0.0.1:6379> SET a 100
OK
127.0.0.1:6379> incr a
(integer) 101
127.0.0.1:6379> incr a
(integer) 102
127.0.0.1:6379> incrby a 50
(integer) 152

GETSET

  • 키를 새 값으로 변경하고 이전 값을 반환
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> GETSET a "Bye World"
"Hello World"
127.0.0.1:6379> GET a
"Bye World"

MSET/MGET

  • 단일 명령으로 여러 데이터를 변경/조회
127.0.0.1:6379> MSET a "Hello World" b "Bye World"
OK
127.0.0.1:6379> MGET a b
1) "Hello World"
2) "Bye World"

EXISTS

  • 키가 존재하는지 확인
127.0.0.1:6379> MSET a "Hello World" b "Bye World"
OK
127.0.0.1:6379> EXISTS a
(integer) 1
127.0.0.1:6379> EXISTS c
(integer) 0

DEL

  • 키 삭제
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> DEL a
(integer) 1
127.0.0.1:6379> DEL a
(integer) 0

TYPE

  • 키의 타입 조회
127.0.0.1:6379> TYPE a
none
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> TYPE a
string
127.0.0.1:6379> SET b 100
OK
127.0.0.1:6379> TYPE b
string
127.0.0.1:6379> RPUSH list A B C D E
(integer) 5
127.0.0.1:6379> TYPE list
list

EXPIRE

  • 키의 만료 시간 설정
  • 아래 예제는 5초 후 키 삭제
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> EXPIRE a 5
(integer) 1
127.0.0.1:6379> GET a
"Hello World"
127.0.0.1:6379> GET a
(nil)
  • 아래 예제는 키 생성시 바로 만료 시간 설정
127.0.0.1:6379> SET a "Hello World" EX 60
OK
127.0.0.1:6379> TTL a
(integer) 59
127.0.0.1:6379> TTL a
(integer) 58

TTL

  • 키 만료 남은 시간 조회
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> EXPIRE a 60
(integer) 1
127.0.0.1:6379> TTL a
(integer) 59
127.0.0.1:6379> TTL a
(integer) 57
127.0.0.1:6379> TTL a
(integer) -2

PERSIST

  • 키 만료 설정 제거
127.0.0.1:6379> SET a "Hello World"
OK
127.0.0.1:6379> EXPIRE a 60
(integer) 1
127.0.0.1:6379> TTL a
(integer) 58
127.0.0.1:6379> TTL a
(integer) 57
127.0.0.1:6379> PERSIST a
(integer) 1
127.0.0.1:6379> TTL a
(integer) -1

List

설명

  • 레디스의 리스트는 linked list 로 만들어졌다. 즉 리스트안에 수백만 개의 아이템이 있더라도 목록의 head와 tail에 값을 추가할 때 동일한 시간이 소요된다.
  • 인덱스를 이용해서 아이템에 빠르게 접근해야 할 경우가 많다면 sorted set을 사용하는 것을 권장한다.

LPUSH/RPUSH

  • 리스트의 왼쪽/오른쪽에 데이터를 추가하는 명령어
127.0.0.1:6379> RPUSH list A
(integer) 1
127.0.0.1:6379> RPUSH list B
(integer) 2
127.0.0.1:6379> LPUSH list C
(integer) 3
127.0.0.1:6379> RPUSH list2 A B C D E
(integer) 5

LRANGE

  • 리스트의 범위로 조회
  • 아래 예제는 위에서 추가한 데이터 조회
  • 파라미터로 시작 인덱스와 종료 인덱스 필요
  • 종료 인덱스가 -1인 것은 마지막 인덱스까지 조회한다는 의미
127.0.0.1:6379> LRANGE list 0 2
1) "C"
2) "A"
3) "B"
127.0.0.1:6379> LRANGE list2 0 -1
1) "A"
2) "B"
3) "C"
4) "D"
5) "E"

LPOP/RPOP

  • 왼쪽/오른쪽에서 데이터 pop하는 기능
127.0.0.1:6379> RPUSH list A B C
(integer) 3
127.0.0.1:6379> RPOP list
"C"
127.0.0.1:6379> RPOP list
"B"
127.0.0.1:6379> LPOP list
"A"
127.0.0.1:6379> LPOP list
(nil)
127.0.0.1:6379> KEYS *
(empty array)

BLPOP/BRPOP

  • LPOP/RPOP과 동일하나 POP할 데이터가 없으면 Block 상태로 대기함
  • 마지막 파라미터로 지정한 초만큼 대기, 0이면 무한 대기
  • session-1
    127.0.0.1:6379> BRPOP list 0
    
  • session-2
    127.0.0.1:6379> RPUSH list "Hello World"
    (integer) 1
    
  • session-1
    127.0.0.1:6379> BRPOP list 0
    1) "list"
    2) "Hello World"
    (36.72s)
    

LTRIM

  • 지정된 범위의 데이터만 남기고 나머지 데이터는 삭제
127.0.0.1:6379> RPUSH list 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LTRIM list 0 2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "1"
2) "2"
3) "3"

LLEN

  • 리스트 사이즈 조회
127.0.0.1:6379> RPUSH list 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LLEN list
(integer) 5

Hash

설명

  • key-value 형태의 데이터
  • 객체를 표현할 때 편리함

HMSET/HMGET

  • Hash 데이터를 추가/조회
127.0.0.1:6379> HMSET user:1000 username sanggeun.choi age 30
OK
127.0.0.1:6379> HMGET user:1000 username age
1) "sanggeun.choi"
2) "30"

HGET

  • 데이터 필드 단건 조회
127.0.0.1:6379> HGET user:1000 username
"sanggeun.choi"

HGETALL

  • 데이터 필드와 값 전체 조회
127.0.0.1:6379> HGETALL user:1000
1) "username"
2) "sanggeun.choi"
3) "age"
4) "30"

HDEL

  • 데이터 필드 삭제
127.0.0.1:6379> HDEL user:1000 username
1

HINCRBY

  • 데이터 필드의 값 증가
127.0.0.1:6379> HMSET user:1000 age 20
OK
127.0.0.1:6379> HINCRBY user:1000 age 10
(integer) 30
127.0.0.1:6379> HGETALL user:1000
1) "age"
2) "30"

Set

SADD/SMEMBERS

  • Set 데이터 추가/조회
127.0.0.1:6379> SADD myset 1 2 3
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "1"
2) "2"
3) "3"

SISMEMBER

  • Set에 해당 데이터가 있는지 확인
127.0.0.1:6379> SISMEMBER myset 2
(integer) 1
127.0.0.1:6379> SISMEMBER myset 22
(integer) 0

SRANDMEMBER/SPOP

  • Set 요소를 랜덤으로 하나씩 가져오는 명령어
  • SRANDMEMBER는 제거되지 않고, SPOP은 해당 요소가 제거됨
127.0.0.1:6379> SADD myset 5 4 3 2 1
(integer) 5
127.0.0.1:6379> SRANDMEMBER myset
"2"
127.0.0.1:6379> SRANDMEMBER myset
"4"
127.0.0.1:6379> SCARD myset
(integer) 5
127.0.0.1:6379> SPOP myset
"4"
127.0.0.1:6379> SPOP myset
"1"
127.0.0.1:6379> SCARD myset
(integer) 3

SUNIONSTORE

  • Set 데이터를 덮어씌우는 기능
  • 아래 예제는 b 데이터를 a에 덮어씌움
127.0.0.1:6379> SADD a 2 3 4
(integer) 3
127.0.0.1:6379> SADD b 1 3 4 5
(integer) 4
127.0.0.1:6379> SUNIONSTORE a b
(integer) 4
127.0.0.1:6379> SMEMBERS a
1) "1"
2) "3"
3) "4"
4) "5"

SCARD

  • Set의 사이즈를 확인
127.0.0.1:6379> SADD myset 1 2 3
(integer) 3
127.0.0.1:6379> SCARD myset
(integer) 3

Sorted Set

설명

  • Hash와 Set의 혼합된 형태
  • score를 키로해서 Set을 만들어 정렬된 순서를 가짐
  • 아이템은 다음의 규칙에 의해 정렬된다.
    • A와 B의 점수가 다를 때 A.score > B.score 라면 A>B
    • A와 B의 점수가 같을 때 A 문자열이 사전순으로 B보다 빠를 경우 A>B. 정렬된 집합에는 고유 요소만 있으므로 A와 B문자열은 같을 수 없다.

ZADD

  • Sorted Set 데이터 추가
127.0.0.1:6379> ZADD user 1990 "john"
(integer) 1
127.0.0.1:6379> ZADD user 1991 "tom"
(integer) 1
127.0.0.1:6379> ZADD user 1992 "jane"
(integer) 1

ZRANGE/ZREVRANGE

  • Sorted Set 데이터를 순서대로/역순으로 조회
  • 지정된 index 범위의 데이터 조회
127.0.0.1:6379> ZRANGE user 0 -1
1) "john"
2) "tom"
3) "jane"
127.0.0.1:6379> ZRANGE user 0 -1 WITHSCORES
1) "john"
2) "1990"
3) "tom"
4) "1991"
5) "jane"
6) "1992"
127.0.0.1:6379> ZREVRANGE user 0 -1
1) "jane"
2) "tom"
3) "john"

ZRANGEBYSCORE

  • 지정된 score 범위의 데이터 조회
127.0.0.1:6379> ZRANGEBYSCORE user -INF 1991
1) "john"
2) "tom"

ZREMRANGEBYSCORE

  • 지정된 score 범위의 데이터 삭제
127.0.0.1:6379> ZREMRANGEBYSCORE user 1990 1991
(integer) 2
127.0.0.1:6379> ZRANGE user 0 -1
1) "jane"

ZRANK/ZREVRANK

  • 데이터의 인덱스를 조회/역순 조회
127.0.0.1:6379> ZADD user 1990 "john"
(integer) 1
127.0.0.1:6379> ZADD user 1991 "tom"
(integer) 1
127.0.0.1:6379> ZADD user 1992 "jane"
(integer) 1
127.0.0.1:6379> ZRANK user tom
(integer) 1
127.0.0.1:6379> ZRANK user jane
(integer) 2
127.0.0.1:6379> ZREVRANK user tom
(integer) 1
127.0.0.1:6379> ZREVRANK user jane
(integer) 0

참고

반응형

'Development > Redis' 카테고리의 다른 글

[Redis] Pub/Sub (with Spring)  (0) 2020.12.30
[Redis] Sentinel  (0) 2020.12.30
[Redis] Master-Slave Replication  (0) 2020.12.30
[Redis] 명령어  (0) 2019.03.11
[Redis] 스프링 연동  (0) 2019.03.10

+ Recent posts