Redis 기본 자료구조

ack·2022년 1월 5일
1

Redis

목록 보기
2/2
post-thumbnail

Redis란?

  • 데이터를 지칭하는 key와 이에 대한 데이터를 value 구조로 저장
  • 많은 자료구조 (Collection) 제공
  • Replication을 제공해서 더 서비스를 안정적
    • 레디스의 데이터를 거의 실시간으로 다른 레디스 노드에 복사하는 작업
    • 서비스를 제공하던 첫 번째 레디스 노드가 다운되더라도, 데이터를 받은 두 번째 레디스 노드가 서비스를 계속 할 수 있음
  • Repository : github.com/redis/redis
  • 인메모리 데이터 구조 저장소
    - 인메모리란? 메인 메모리 RAM에 데이터를 올려서 사용하는 방법으로 빠른 속도가 장점
  • Cluster 모드 제공
  • 메모리 파편화 문제가 있음
  • jemalloc이 메모리 관리함
  • 주로 Cache로 사용 \Rightarrow look-aside cache

Redis의 자료구조

  • String: key-value 값으로 저장
  • List : 선형리스트의 구조
  • Set : 중복데이터가 없음
  • Hash
  • Sorted Set : score값으로 정렬 가능 set, ranking 처리 등의 사용

String

  • key-value 형태로 저장
  • set, get 명령어 사용
  • 기본적인 Hash Table 이용
  • 여러개 조회시, 속도를 위해 key, value의 크기를 제한하여 처리량 조절하기 \Rightarrow redis는 Single Thread여서 다른 명령어를 동시에 처리할 수 없음
# 한개 조회
set <key> <value>
get <key> <value>
# 여러개 조회
mset <key> <value> <key> <value> ...
mget <key> <key> <key> ...

List

  • 중간에 추가/삭제가 느림, head-tail에서 추가/삭제
  • O(n)의 탐색시간이 걸리는 성형 탐색
  • queue 형태로 사용하는것이 좋음
# 왼쪽에 삽입
lpush <key> <value>
# 오른쪽에 삽입
rpush <key> <value>
# 삭제
lpop <key>
rpop <key>

Set

  • 유일한 값
  • 팔로워 리스트, 친구리스트 \Rightarrow 특정 그룹의 사용
  • Spring Security Oauth의 Access Token을 저장하는 Redis Token Store 방식
sadd <key> <item>
# 존재 여부를 체크, 있으면 1 없으면 0 반환
sismember <key> <item>
# 삭제
srem <key> <value>
# key의 모든 item 조회
smembers <key>

Sorted Set

  • 아이템들의 랭킹을 가지는데에 사용
  • Double 형태, 특정 정수값을 사용할 수 없음
  • Skiplist 자료구조
    • O(log n)의 검색속도
# item이 이미 존재하면 해당 score로 변경함
zadd <key> <score> <item> 
zrange <key> <start index> <end index>
# 모든 item 조회
zrange <key> 0 -1
# 내림차순 정렬하여 조회
zrevrange <key> <start index> <end index>
# 초과 미만 값 조회
zrangebyscore <key> <start score> <end score>
# 이상 이하 값 조회
zrangebyscore <key> (<start score> (<end score>
# score >= 70 값 조회
zrangebyscore <key> (70 +inf

Hash

  • 일반적인 key-value 형태
  • 특정군의 data로 묶기
  • key 하위에 subkey를 이용해 추가적인 Hash Table을 제공하는 자료구조
# 한개 값 삽입 및 삭제
hset <key> <subkey> <value>
hget <key> <subkey>
# 여러 값 삽입 및 삭제
hmset <key> <subkey> <value> <subkey> <value> ...
hnget <key> <subkey> <subkey> <subkey> ... 
# 모든 subkey와 value 가져오기, Collection에 너무 많은 key가 있으면 장애의 원인이 됨
hgetall <key>
# 모든 value값만 가져오기
hvlas <key>

Redis Transaction

Multi / Exec

  • 한번에 실행되는 것을 보장해주는 명령
  • Multi : 명령을 모아서 대기
  • Exec : Multi로 모인 명령을 다른 명령의 수행없이 순서대로 실행
  • Redis는 싱글스레드여서 다른 명령어를 수행하지 않음
  • Multi에 너무 많은 명령은 Redis전체 성능을 저하시킬 수 있음

Redis pipline

보통 라이브러리들이 명령을 보내고 응답을 기다림, 이 기다리는 time gap이 생기게 됨.. \Rightarrow Redis pipline 동기적으로 보내는 경우, 응답을 기다리지 않고 명령을 미리 보내도록 함

  • Redis에서 제공하는 것이 아닌 라이브러리에서 제공
  • Asnc redis client라면 기능을 따로 제공할 필요가 없음
    • ex) JAVA의 lettuce redis client

참고

profile
아자 (*•̀ᴗ•́*)و

0개의 댓글