반응형
들어가며
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 |