• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Redis Core, I/O, Transaction, Lock
        2023년 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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바