- Redis Core, I/O, Transaction, Lock2023년 06월 03일
- starryeye
- 작성자
- 2023.06.03.:01
Redis Core
Redis 는 기본적으로 싱글 스레드 모델을 사용하는 데이터베이스이다.
한번에 하나의 명령어만 처리할 수 있음을 뜻한다.
따라서, 하나의 연산에 대해 원자성을 보장할 수 있다.
조금 다르게 말하면,
병렬성(Parallelism) 없이 작업이 진행되고 동시성(Concurrency)으로 처리된다.
참고>
병렬성: 한 번에 여러가지 일을 처리
동시성: 한 번에 한가지 일을 하지만, 여러 가지 일을 돌아가면서 처리(각각 GPU 와 CPU 를 연상해보자..)
따라서, 단일 연산에 대해 동시성 문제가 없다.
그래서 단일 연산에 대해 복잡한 동기화와 락 설정을 걱정하지 않아도 된다.그러나, 하나의 Value에 대해 여러 연산(조회 후, 업데이트 등)을 처리함에 있어서
분산 환경일 경우 원자성을 보장할 필요가 있을 수도 있다..이때는 분산 락을 이용해보자. (Redisson Client)
Redis I/O
Redis 는 6.0 버전 부터 멀티 쓰레딩을 통한 I/O 작업 처리가 가능해 졌다.
그래도..
해당 멀티 쓰레딩은 네트워크 I/O 에서만 적용되며, 실제 데이터 처리는
싱글 쓰레드이다.
Application 입장에서는 네트워크 I/O 가 멀티 쓰레드로 처리 되므로
병렬적으로 빠르게 엑세스 할 수 있게 되었다.
싱글 쓰레드로 처리하면.. 모든 명령이 순차적으로 처리되어 느릴 수 있지 않을까..
라고 생각할 수 있다. 이 생각은 오산이다..
Redis 는 메모리 기반의 데이터 저장소이고..
대부분의 작업이 O(1) 로 처리 되므로 상관 없다.
오히려 싱글 쓰레드라서 원자성과 고립성이 보장되는 이점이 있을 뿐이다.
Redis Transaction
개인적인 생각으로..
분산시스템의 Redis 에서 단일 Value에 대한 분산락과더 일반적으로 분산 환경의 동시성처리를 위한 분산락은 가끔 사용할 수 있을 듯하나..
여러 Value 에 대한 일관성을 보장하기 위해.. 트랜잭션을 사용하거나.. 여러 락을 사용하는 상황에서는
관계형 데이터베이스를 이용할 듯하다..
Redis 는 트랜잭션 처리를 위해.. 아래 4가지의 명령어를 제공한다.
MULTI : 트랜잭션 시작, 큐에 명령어를 순차적으로 적재
EXEC : 적재된 큐의 명령어를 순차적으로 실행
DISCARD : 트랜잭션 중단, MULTI 이후에 큐에 적재된 모든 명령어를 삭제
WATCH : 트랜잭션에서 사용되는 키를 감시한다. 다른 클라이언트에 의해 변경되면 EXEC 실패
-> WATCH 명령어로 낙관적 락을 구현해볼 수 있다.
-> 트랜잭션에서 사용되는 키가 RDBMS 에서 보통 version에 해당하는 컬럼이라 보면 편하다.MULTI 와 EXEC 을 사용한다면..
Redis 가 싱글 쓰레드인점을 고려하면 뮤텍스.. 비관적 락이다.(베타)
@Transactional
Redis Client 자체적으로 @Transactional 과 같은 트랜잭션 관리 기능을 지원하지는 않는다.
하지만, Spring Data Redis 가 Spring 의 @Transactinoal 을 지원하여 내부적으로
Redis Client 를 이용하여 Redis 의 4가지 명령어를 연동해 놓았다.
-> 하지만, RDBMS 에서 사용하던 @Transactional 을 기대해선 안된다...
redisTemplate.setEnableTransactionalSupport(true); @Transactional public void method() { //logic }
간단한 사용법은 위와 같다..
주의사항>
다시 한번 강조하지만, 관계형 데이터베이스에서 사용하던 트랜잭션과 다르다..
구체적으로는...
롤백 기능이 없다..
DISCARD 명령어를 통해 중단은 되나..
EXEC 호출 이후 실행된 명령어를 취소할 수 없다.
'DataBase > NoSQL' 카테고리의 다른 글
Redis Data Type 3 (0) 2023.06.02 Redis Data Type 2 (1) 2023.06.02 Redis Data Type 1 (0) 2023.06.02 Redis 시작해보기 (0) 2023.06.01 MongoDB Sharded Cluster (0) 2023.06.01 다음글이전글이전 글이 없습니다.댓글