Redis 명령어3

이건·2024년 9월 17일

Redis

목록 보기
4/5

SET age 20 명령어를 사용하면 Redis에 숫자를 저장하는 것처럼 보이지만 사실은 20을 문자열로 저장한다.

이렇게 저장된 데이터를 GET age를 통해 불러오면 문자열 "20"이 반환된다.

하지만 Redis는 숫자도 지원해야 한다고 깨닫고 숫자로 변환되게끔 했다.

숫자를 다루는 명령어

INCR, DECR

INCR age → 기존 키에 숫자 1을 더한다.

DECR age → 기존 키에 숫자 1을 뺀다.

INCRBY, DECRBY

INCR과 DECR과 동일하게 작동하지만 더하고 뺄 숫자를 지정할 수 있다.

INCRBY age 20 → 기존 키에 숫자 20을 더한다.

DECRBY age 10 → 기존 키에 숫자 10을 뺀다.

INCRBYFLOAT

소수점이 있는 FLOAT 값을 처리하려면 INCRBYFLOAT를 사용한다.

INCRBYFLOATE에 키 이름과 함께 소수점이 있는 숫자를 전달한다. 뺄셈을 하고 싶다면 소수점이 있는 숫자에 -를 붙이면 된다.

INCRBYFLOAT age -3.333 → 기존 키에 3.333을 뺀다.

숫자를 다루는 명령어가 필요한 이유

만약 INCR이 없다면

데이터를 먼저 Redis에서 API서버에 문자열로 가져오고 API서버에서 문자열을 숫자로 변환하고 +1을 한다. 그 다음 Redis에 값을 저장하기 위해 SET 명령어를 사용해 age에 21을 저장한다.

이렇게 두 단계를 거쳐 INCR과 동일한 작업을 처리해야 한다.

그래서 INCR이 존재하는 이유는 뭔데?

위의 방식이 좋지 않은 첫번째 이유는 단순히 Redis에 두 번 접근해야 하기 때문이다. API 서버에서 Redis에 요청을 2번 해야 한다. 이는 INCR을 사용하는 것보다 단순히 2배 더 오래 걸릴 수 있다.

따라서 하나의 명령어로 처리할 수 있는 일을 두 개의 명령어로 처리하는 것은 좋지 않다.

또한, 두 번째 이유는 좀 더 근본적인 이유다.

API 서버가 2개고 동시에 age의 값을 1 올리는 요청 2개가 동시에 들어왔다고 가정해보면 이 경우 당연히 결과는 age가 22가 되어야 한다. 하지만,

2개의 요청을 처리할 때 내부적으로 어떻게 작동하는지 생각해보면

요청 2개가 각각 Redis에서 동시에 20이라는 값을 가져온다. 두 API 서버가 동시에 받은 값을 숫자로 변환한 다음 1을 더해 21을 만들고 마찬가지로 동시에 Redis에 age 값을 업데이트 한다.

예상 결과값은 22인데 두 서버가 동시에 요청을 처리하고 보니 결과는 21이 되었다.

엄청난 양의 요청을 받다보면 이러한 일이 반드시 발생한다.

이러한 문제를 해결하는 가장 간단한 방법은 INCR 명령어를 사용하는 것이다.

동시에 요청을 받았지만 원하던 대로 두 요청을 모두 처리해 값이 22가 된다.

결국 숫자를 다루는 명령어가 존재한다는 사실만으로도 Redis가 기본적으로 동기식으로 작동하며 다양한 요청을 처리할 때 동시성을 고려해야 한다는 것을 알 수 있다.

0개의 댓글