기록하는 습관

Redis, Redisson, Jedis 본문

개발/Research

Redis, Redisson, Jedis

로그뉴 2022. 7. 12. 15:43

Redis


##1. 특징

  • 메모리 기반의 key-value 구조의 데이터 관리 시스템
  • 모든 데이터를 메모리에 저장하고 조회하기때문에 빠른 Read, Write 속도를 보장하는 NoSql
  • 영속성을 지원하는 In-memory 데이터 저장소
  • 읽기 성능 증대를 위한 서버 복제 지원
  • 쓰기 성능 증대를 위한 클라이언트 측 sharding 지원
  • 성능은 서버에 따라 다르나 초당 2만 ~ 10만회 수행

##2. 기능

  • In-Memory 캐싱
  • Pub/Sub 메세지 큐
  • 세션 스토어

##3. 장점

  • 리스트, 배열과 같은 데이터를 처리하는데 유용
  • 리스트형 데이터 입력과 삭제가 MySql에 비해 10배정도 빠름.
  • 메모리를 활용하면서 영속적인 데이터 보존(Persistence)
    • 스냅샷 기능을 제공해 메모리 내용을 *.rdb 파일로 저장하여 해당 시점으로 복구할 수 있음
    • AOF : Redis의 모든 Wirte/Update 연산을 log 파일에 기록 후 서버 재시작 시 순차적으로 재실행, 데이터 복구
  • 1개의 싱글 스레드로 수행되기 때문에, 서버 하나에 여러개의 Redis Server를 띄울 수 있음. (master-slave 구조)

##4. 단점

  • In-memory 방식이기 때문에 장애 발생시 데이터 유실이 발생
    • 영속적인 데이터 보존을 위해 스냅샷과 AOF 기능을 통한 복구 방식을 주의해서 작성해야 데이터 유실에 대비할 수 있음

 

##5. Redis query 사용

 

##6. Redis 용량

Redisson


##1. 특징

  • In-memory 데이터 그리드 기능을 가진 Redis Java Client
  • 데이터 모델링과 어플리케이션 로직에 집중할 수 있게 도와줌
  • Redis Cluster 설정과 지원이 간단하고 용이함.
  • Netty를 사용해서, 비동기 논블록킹 I/O를 제공, 특이하게도 레디스의 명령어를 직접 제공하지 않고 Lock과 같은 특정한 구현체의 형태를 제공

 

##2. lock을 사용하는 이유

  • 일반적으로 자바에서는 공유된 자원에 여러 스레드가 접근할 때 lock을 사용.
  • 여러 서버를 운영하는 분산 환경에서는 한 서버에 lock이 걸려 있어도 다른 서버로 동일한 요청이 가게 되면 동기화 보장을 할 수 없음.
  • 분산 lock은 DB등 공통 저장소를 이용하여 자원이 사용중인지를 체크하여 전체 서버에서 동기화된 처리를 가능하게 함.

 

##3. Redisson이 분산락을 구현한 방법

  1. time-out을 설정하여 데드락 방지
  2. 스핀락을 사용하지 않음
    1. 스핀락이란? lock 획득 실패 시 바로 재진입 하여 lock 획득을 다시 시도하는 것. → 계속 레디스에 요청을 보내므로 부담을 줄 수 있음.
    2. Redisson은 redis의 pub/sub 시스템을 이용하기 때문에, lock이 해제될 때마다 subscribe 중인 클라이언트들에게 'lock 획득 시도 가능' 메시지 전송
  3. Lua 스크립트 사용
    1. 여러 명령어를 하나의 트랜잭션으로 묶는 과정에서 Lua 스크립트로 atomic을 보장
  •  

 

##3. 단점

  • @Transactional과 동시에 동작하지 않음.
  • Redisson을 이용하여 분산락을 구현했을 경우, 동시성은 보장되지만 트랜잭션 처리 부분은 빠졌기 때문에 완벽하게 ACID가 보장되는 코드가 아님.
  • 동시에 동작하지 않기 때문에 별도로 transcational manager를 직접 주입하여 비즈니스 코드 자체에서 commit, rollback, start 등을 해줘야 함
  • 분산락 구현 시에는 unlock()전에 commit 해줘야 함.

 

참고

Jedis


##1. 특징

  • 자바 언어로 된 Redis 클라이언트 라이브러리
  • "Read From Slave"를 지원하지 않아, 마스터 노드에서만 Write/Read 해야 함.

'개발 > Research' 카테고리의 다른 글

Spark, Hadoop  (0) 2022.07.12
offset, cursor 기반 pagination  (0) 2022.07.12
lock 오픈소스 (ShedLock, dLock)  (0) 2022.07.12
AWS lambda (s3)  (0) 2022.07.12
DB 리서치 (S3, Mongo, Mysql - InnoDB, MyISAM, heap)  (0) 2022.07.12
Comments