개요
- 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방식)