Redis 싱글 쓰레드에 대한 고찰

Terror·2025년 1월 16일

개요

  • Redis의 싱글쓰레드라는 개념에 대해 정확하게 알지못해, 여러가지 실험을 통해 풀어나가보자

첫번째 실험

Redis Set Vs Redis LeftPush

Redis Set

    @Test
    public void 레디스_동시성_SET_테스트() {
        Runnable task1 = () -> {
            for (int i = 0; i < 10; i++) {
                rt.opsForValue().set(REDIS_TEST_KEY + i,"A" + 1);
            }
        };
        Runnable task2 = () -> {
            for (int i = 0; i < 10; i++) {
                rt.opsForValue().set(REDIS_TEST_KEY + i,"B" + 1);
            }
        };

        Thread t1 = new Thread(task1);
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            for (int i = 0; i < 10; i++) {
                System.out.println(REDIS_TEST_KEY + i + " -> " + rt.opsForValue().get(REDIS_TEST_KEY + i));
            }
        }
    }

  • 동시성은 잘 보장되는 모습을 볼 수 있다
  • A의 데이터가 삽입된후, B데이터가 삽입되어 데이터가 달라진 모습을 확인 할 수 있다
  • 이것도 결국 Redis안에서 동기적으로 처리되었다고 볼 수 있고, 데이터는 덮씌어질뿐이다

Redis LeftPush

    @Test
    public void 레디스_동시성_LEFTPUSH_테스트() {
        Runnable task1 = () -> {
            for (int i = 0; i < 10; i++) {
                rt.opsForList().leftPush(REDIS_TEST_KEY + i, "A" + i);
            }
        };
        Runnable task2 = () -> {
            for (int i = 0; i < 10; i++) {
                rt.opsForList().leftPush(REDIS_TEST_KEY + i, "B" + i);
            }
        };

        Thread t1 = new Thread(task1);
        Thread t2 = new Thread(task2);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            for (int i = 0; i < 10; i++) {
                System.out.println(REDIS_TEST_KEY + i + " -> " + rt.opsForList().leftPop(REDIS_TEST_KEY + i) );
            }
        }
    }

  • 일단 데이터를 확인해보면 데이터가 덮씌워지지않고, 같은 Key여도 다른 Value이기 떄문에 서로 구분지어져 저장되는것을 확인 할 수 있다
  • 이런식으로 데이터가 잘 저장되있고, 동시성 문제역시 생기지않은 것을 확인 할 수 있다

나는 오늘 무엇을 알았는가?

  • Redis Set
    • 하나의 key에 하나의 value만 저장 가능하다
    • 따라서 동시성은 처리되어도, 데이터를 덮씌울 가능성이 있다
  • Redis LeftPush
    • 하나의 Key에 여러개의 value의 저장이 가능하다
    • 동시성도 처리되고, 데이터를 덮씌우지않고, 순서의 보장이 가능하다 (queue방식)
profile
테러대응전문가

0개의 댓글