Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Kotlin in action 5장
- 20055
- 스프링 컨테이너와 스프링 빈
- 객체 지향 설계와 스프링
- Kotlin
- 코틀린인액션
- 싱글톤 컨테이너
- 백준 13460 Python
- KotlinInAction
- Kotlin In Action
- 코틸린인액션
- kotlin in action 정리
- 스프링 핵심 원리 이해
- Python
- Kotlin in action 10장
- 코틀린
- 컨베이어 벨트 위의 로봇 Python
- 고급매핑
- 백준
- Kotlin in action 6장
- 기능개발 python
- 13460 구슬탈출 2
- 스프링 핵심 원리 - 기본편
- 백준 20055 컨베이어 벨트 위의 로봇
- Kotlin in action 3장
- 스프링 핵심 원리
- 7장 고급매핑
- 자바 ORM 표준 JPA 프로그래밍 7장
- 20055 컨베이어 벨트 위의 로봇
- spring
Archives
- Today
- Total
기록하는 습관
Redis, Redisson, Jedis 본문
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 사용
- redis에서 sql query를 사용할 수 있다.
- 참고: http://redisgate.jp/redis/sql/select_intro.php
##6. Redis 용량
Redisson
##1. 특징
- In-memory 데이터 그리드 기능을 가진 Redis Java Client
- 데이터 모델링과 어플리케이션 로직에 집중할 수 있게 도와줌
- Redis Cluster 설정과 지원이 간단하고 용이함.
- Netty를 사용해서, 비동기 논블록킹 I/O를 제공, 특이하게도 레디스의 명령어를 직접 제공하지 않고 Lock과 같은 특정한 구현체의 형태를 제공
##2. lock을 사용하는 이유
- 일반적으로 자바에서는 공유된 자원에 여러 스레드가 접근할 때 lock을 사용.
- 여러 서버를 운영하는 분산 환경에서는 한 서버에 lock이 걸려 있어도 다른 서버로 동일한 요청이 가게 되면 동기화 보장을 할 수 없음.
- 분산 lock은 DB등 공통 저장소를 이용하여 자원이 사용중인지를 체크하여 전체 서버에서 동기화된 처리를 가능하게 함.
##3. Redisson이 분산락을 구현한 방법
- time-out을 설정하여 데드락 방지
- 스핀락을 사용하지 않음
- 스핀락이란? lock 획득 실패 시 바로 재진입 하여 lock 획득을 다시 시도하는 것. → 계속 레디스에 요청을 보내므로 부담을 줄 수 있음.
- Redisson은 redis의 pub/sub 시스템을 이용하기 때문에, lock이 해제될 때마다 subscribe 중인 클라이언트들에게 'lock 획득 시도 가능' 메시지 전송
- Lua 스크립트 사용
- 여러 명령어를 하나의 트랜잭션으로 묶는 과정에서 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